matlab中矩阵各列两两作差后求累加和

来源:百度知道 编辑:UC知道 时间:2024/07/07 21:01:00
假设有一个1000*1000的矩阵。我需要按行,两两做差。然后把所得结果的绝对值,累加求和。最后的结果形成一个1*1000的矩阵。不知道怎么处理。哪位知道的大大帮下忙
以4*6阶矩阵举例吧。a=[6,5,4,3,6,4;2,3,8,5,1,6; 4,5,8,3,1,2; 2,3,7,9,4,2]。
这样的一个4*6矩阵。我要做的操作如下:首先,第一行与第二行相减(这里无所谓谁减谁,因为所得结果会求绝对值。但是为了方便说明还是说1减2),结果得[4,2,-4,-2,5,-2]。求其绝对值为[4,2,4,2,5,2]。随后1-3,1-4;所得结果同样的取绝对值。这样就有了3组值。因为1-1为零所以可以不考虑。下同。
随后是第二行去减,因为1,2已经减过了,所以可以不考虑,只考虑2,3和2,4的结果,同样相减之后求绝对值。
接着是第三行,因为1,3和2,3已经减过了,所以可以只考虑3与4的相减。
接着是第四行,因为1,4;2,4还有3,4都已相减过,所以4可以不用考虑了。
这样所得结果是如[4,2,4,2,5,2]样子的6个行向量。可以认为这六个行向量组成了一个6*6的矩阵。将这个矩阵按列求和,结果不就是一个1行,6列的矩阵吗或者说是一个行向量吗。
或者不考虑重复,把1-2和2-1都考虑进去,这样因为是结果的绝对值相加,所得到得求和结果除2就应该和我所要的结果一致了。
这里 有个程序 [m,n]=size(a);
b=nchoosek(1:m,2);
sum(abs(a(b(:,1),:)-a(b(:,2),:))) 这个程序可以实现这个功能,但是在矩阵达到1000*1000的大小时,运行,会提示,超出matlab允许的维数。减小行数后,发现最大可以实现260行左右的矩阵。大于260*1000时又会出现out of memory的提示。这里想求一个能实现1000*10000矩阵进行此运算的程序。谢谢了。

对不起,这是我的失误,因为nchoosek是直接得到整个矩阵的,数值一多就out of memory了。其实直接用循环算好了,数值多的话稍微等一会就行了。

a=[6,5,4,3,6,4;2,3,8,5,1,6; 4,5,8,3,1,2;2,3,7,9,4,2]
[m,n]=size(a);
c=zeros(1,n);
for i=1:m-1
for j=i+1:m
c=c+abs(diff(a([i j],:)));
end
end
c%c就是所要的结果

作差是有方向的

for循环就可以了