替换2D矩阵的元素

时间:2014-03-16 11:07:48

标签: performance matlab conditional-statements product vectorization

我正在努力提高MATLAB代码的效率。它的作用是,它将矩阵的非零元素替换为同一行中其余非零元素的乘法。例如,

X = [2 3 6 0; 0 3 4 2]

转换为

X = [18 12 6 0; 0 8 6 12]

在for循环中实现这是一项简单的任务。它检查每一行,查找非零值并进行替换。我想摆脱for循环。有没有办法在没有循环的情况下实现它?

2 个答案:

答案 0 :(得分:3)

<强>代码

X = [2 3 6 0; 0 3 4 2];

X1 = X;
X1(~X) = 1;

out = bsxfun(@rdivide,prod(X1,2),X1).*(X~=0)

<强>输出

out =

    18    12     6     0
     0     8     6    12

答案 1 :(得分:1)

可能首先获得行产品一次,然后除以您不想要的元素是最简单的方法:

X = [2 3 6 0; 0 3 4 2]
Y=X
%get the product of all elements in a row
Y(Y==0)=1
Y=prod(Y,2)
%repeat Y to match the size of X
Y=repmat(Y,1,size(X,2))
%For all but the zero elements, divide Y by X, which is the product of all other elements.
X(X~=0)=Y(X~=0)./X(X~=0)