假设我在MATLAB中有以下矩阵:
A =[0 0 4 0;
0 5 0 3;
1 2 0 0];
给出以下向量:
b1 = [1 2 3];
b2 = [2 3 4 5];
输出应如下所示:
C1 =[0 0 3 0;
0 3 0 1;
-2 -1 0 0];
C2 =[0 0 0 0;
0 2 0 -2;
-2 -1 0 0];
C1和C2是从非零元素处发生的向量中逐列减去原始矩阵A的行。注意A实际上是稀疏矩阵。显然,不使用循环的答案是值得赞赏的!谢谢
答案 0 :(得分:2)
这个可能会更有效率:
A =[0 0 4 0;
0 5 0 3;
1 2 0 0];
b1 = [1 2 3].'; % transpose so it's a column vector
b2 = [2 3 4 5].';
[Arows Acols Avals] = find(A);
C1 = sparse([Arows;Arows], [Acols;Acols], [Avals;-b1(Arows)]);
C2 = sparse([Arows;Arows], [Acols;Acols], [Avals;-b2(Acols)]);
结果:
>> full(C1)
ans =
0 0 3 0
0 3 0 1
-2 -1 0 0
>> full(C2)
ans =
0 0 0 0
0 2 0 -2
-1 -1 0 0
这利用了sparse
添加为重复下标给出的值这一事实。 A
可能稀疏或已满。
答案 1 :(得分:1)
无需使用循环。首先执行减法,然后替换应保留0
的元素。
C1 = A - repmat(b1.',1,size(A,2));
C2 = A - repmat(b2,size(A,1),1);
C1(A==0)=0;
C2(A==0)=0;
C1 =
0 0 3 0
0 3 0 1
-2 -1 0 0
C2 =
0 0 0 0
0 2 0 -2
-1 -1 0 0
在稀疏矩阵上测试
您还可以确认这适用于Sparse Matirces
A = sparse(10,10);
A(5:6,5:6)=rand(2);
b1 = rand(10,1);
b2 = rand(1,10);
B1 = A - repmat(b1,1,size(A,2));
B2 = A - repmat(b2,size(A,1),1);
B1(A==0)=0;
B2(A==0)=0;
答案 2 :(得分:0)
C1 = A ~= 0; // save none zero elements of A
b1 = b1.'; // transpose b1
b1 = [b1, b1, b1, b1]; // create matrix of same size as A
C1 = C1.*b1;
C1 = A-C1;
<强> C1:强>
0 0 3 0
0 3 0 1
-2 -1 0 0
接下来是C2
C2 = A ~= 0;
k = [b2; b2; b2];
C2 = C2.*k;
C2 = A-C2;
<强> C2:强>
0 0 0 0
0 2 0 -2
-1 -1 0 0