How can I make this code simpler
Mostrar comentarios más antiguos
r = 5;
A_r5 = (S_Vals(1,1)*u(:,1)*(V(:,1)).')+(S_Vals(2,1)*u(:,2)*(V(:,2)).')+(S_Vals(3,1)*u(:,3)*(V(:,3)).')+(S_Vals(4,1)*u(:,4)*(V(:,4)).')+(S_Vals(5,1)*u(:,5)*(V(:,5)).');
x_5 = uint8(A_r5);
figure(2)
imshow(x_5);
Respuestas (2)
Image Analyst
el 16 de Feb. de 2022
Yes, that's very complicated to look at. I'd break it into more bite-sized terms, like
term1 = whatever
term2 = whatever
A_r5 = term1 * term2 + term3 or whatever.
11 comentarios
Jorge Arturo Clares Pastrana
el 16 de Feb. de 2022
Image Analyst
el 16 de Feb. de 2022
I don't understand the expressions. Please check the math.
A(1,1)*U(:,1) is one term, but V(:, 1) is another term and you just put them on the same line with a comman between them. What's that supposed to do?
Jorge Arturo Clares Pastrana
el 16 de Feb. de 2022
Image Analyst
el 16 de Feb. de 2022
Do you mean like
[rows, columns] = size(A);
A_r = zeros(rows, 1);
% Rows must equal the number of columns in both U and V or this won't work.
for row = 1 : rows
term1(row) = A(row,1)*U(:, row)*V(:, row)
end
A_r = sum(term1);
Image Analyst
el 16 de Feb. de 2022
Try
A = sum(S .* U .* V);
Jorge Arturo Clares Pastrana
el 16 de Feb. de 2022
Image Analyst
el 16 de Feb. de 2022
Are those matrix products or element by element products?
Jorge Arturo Clares Pastrana
el 16 de Feb. de 2022
Image Analyst
el 16 de Feb. de 2022
I still don't know what you want so I'll give others a chance. You're multiplying a row or column of a matrix (which would be a 1-D vector) times a matrix and I don't know if you want every row multiplied by that row or what. I'm totally confused.
Jorge Arturo Clares Pastrana
el 16 de Feb. de 2022
DGM
el 16 de Feb. de 2022
Need to transpose V(:,row).'
Depends what you mean by "simple". Consider the following three options. Method 2 is compact, but it's slower for large inputs. Method 3 is relatively fast for large inputs. Both method 2 and 3 have an advantage in that they can be scaled to more than 5 "pages".
N = 1000; % large inputs
u = rand(N,5);
V = rand(N,5);
S_Vals = rand(5,1);
% original method
a = timeit(@() testA(S_Vals,u,V))
% simple permutation and elementwise math
b = timeit(@() testB(S_Vals,u,V))
% looped version of original
c = timeit(@() testC(S_Vals,u,V))
% time ratio
[a/b a/c]
function testA(S_Vals,u,V)
A_r5 = (S_Vals(1,1)*u(:,1)*(V(:,1)).') ...
+(S_Vals(2,1)*u(:,2)*(V(:,2)).') ...
+(S_Vals(3,1)*u(:,3)*(V(:,3)).') ...
+(S_Vals(4,1)*u(:,4)*(V(:,4)).') ...
+(S_Vals(5,1)*u(:,5)*(V(:,5)).');
end
function testB(S_Vals,u,V)
A_r5 = sum(permute(S_Vals,[3 2 1]).*permute(u,[1 3 2]).*permute(V,[3 1 2]),3);
end
function testC(S_Vals,u,V)
A_r5 = zeros(size(u,1),size(V,1));
for k = 1:size(S_Vals(1))
A_r5 = A_r5 + (S_Vals(k,1)*u(:,k)*(V(:,k)).');
end
end
Categorías
Más información sobre Loops and Conditional Statements en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!