使用mrdivide(B / A)独立解决行?

时间:2012-12-11 09:42:04

标签: matlab matrix equation-solving

当我回答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

2 个答案:

答案 0 :(得分:1)

您确实可以通过矢量化操作来消除循环。诀窍是使用对角块矩阵。每个块都是矩阵,只有一行(每次都是不同的行)。为ab创建此类块矩阵后,您可以使用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中的相应指数时,这只会产生良好的结果。

相关问题