0

当我回答这个问题时,我的回答是这样开始的:“首先,您可以通过将所有名称存储在一个单元格中来摆脱所有 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
4

2 回答 2

1

您确实可以通过矢量化操作来消除循环。诀窍是使用对角块矩阵。每个块都是只有一行的矩阵(每次都是不同的行)。a在为和 for创建这样的块矩阵后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循环花费更长的时间的情况之一。

于 2012-12-11T13:06:56.153 回答
0

我在想这个:

person/person1

但这只有在 person 中的每个索引都大于 person1 中的相应索引时才会产生良好的结果。

于 2012-12-11T10:45:53.863 回答