当我回答this问题时,我的answer开始于:“对于初学者,您可以通过将所有名称存储在单元格中来删除所有if语句。”
“对于初学者”这一点是因为我认为我可以使用矢量化解决方案添加编辑。但是当我试图这样做时,我遇到了麻烦,使用了mrdivide(b / a)。
我的问题(在代码中标记如下)是否可以在不使用循环的情况下解决b(z,:)/a(z,:)
。换句话说,要为矩阵的每一行独立地求解b/a
。
person = [98 206 35 114;
60 206 28 52;
100 210 31 116;
69 217 26 35;
88 213 42 100];
person1 = [93 208 34 107];
allNames = {'Cameron'; 'David'; 'Mike'; 'Bill'; 'Joe'};
n = 5;
a = max(person,repmat(person1,n,1));
b = min(person,repmat(person1,n,1));
for z = 1:5
percent_error = b(z,:)/a(z,:); %// Here is my question
if percent_error >= 0.85
disp(['Match, its ', allNames{z} ,'!'])
end
end
答案 0 :(得分:1)
您确实可以通过矢量化操作来消除循环。诀窍是使用对角块矩阵。每个块都是矩阵,只有一行(每次都是不同的行)。为a
和b
创建此类块矩阵后,您可以使用mrdivide
:
% # Without loop
tic
A = zeros(size(a) * size(a, 1));
B = zeros(size(b) * size(b, 1));
V = ones(size(a, 2), 1) * (1:size(a, 1));
idx = (0:size(A, 1):numel(A) - 1) + (V(:)' - 1) * size(a, 1) + 1;
A(idx) = a';
B(idx) = b';
X = diag(B / A);
percent_error1 = X(1:size(a, 1):end);
toc
% # With loop
tic
percent_error2 = zeros(5, 1);
for z = 1:5
percent_error2(z) = b(z,:) / a(z,:);
end
toc
结果是:
Elapsed time is 0.000160 seconds.
Elapsed time is 0.000048 seconds.
percent_error1 =
0.9741
0.8516
0.9670
0.8221
0.9611
percent_error2 =
0.9741
0.8516
0.9670
0.8221
0.9611
请注意,这是大型数组的矩阵除法需要比for
循环长的情况之一。
答案 1 :(得分:0)
我在想这个:
person/person1
但是当亲自的每个指数都大于person1中的相应指数时,这只会产生良好的结果。