我正在努力提高MATLAB代码的效率。它的作用是,它将矩阵的非零元素替换为同一行中其余非零元素的乘法。例如,
X = [2 3 6 0; 0 3 4 2]
转换为
X = [18 12 6 0; 0 8 6 12]
在for循环中实现这是一项简单的任务。它检查每一行,查找非零值并进行替换。我想摆脱for循环。有没有办法在没有循环的情况下实现它?
答案 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)