在Matlab中构造一个矩阵,其中每个元素通过将同一行中的所有其他元素相加得到

在Matlab中构造一个矩阵,其中每个元素通过将同一行中的所有其他元素相加得到,matlab,Matlab,我有一个矩阵a,在Matlab中由0和1组成,维数MxN。我想构造一个维度为MxN的矩阵B,其中B(I,j)通过对a(h,j)求和h与I不同的所有h得到 这是我当前的代码 A=randi([0 1],2097144,20); %2097144x20 B = @( )bsxfun(@minus,sum(A(:,2:end),2),A(:,2:end)); %2097144x20 timeit(B) 这大约需要0.5秒 你能提出更快的建议吗 编辑问题,感谢以下评论:代码正确;我对它的解释是错误的

我有一个矩阵
a
,在Matlab中由0和1组成,维数
MxN
。我想构造一个维度为
MxN
的矩阵
B
,其中
B(I,j)
通过对
a(h,j)
求和
h
I
不同的所有
h
得到

这是我当前的代码

A=randi([0 1],2097144,20); %2097144x20
B = @( )bsxfun(@minus,sum(A(:,2:end),2),A(:,2:end)); %2097144x20
timeit(B)
这大约需要0.5秒

你能提出更快的建议吗


编辑问题,感谢以下评论:代码正确;我对它的解释是错误的;正确的解释是


我有一个矩阵
a
,在Matlab中由0和1组成,维数
MxN
。我想构造一个维度为
MxN
的矩阵
B
,其中
B(I,j)
通过对
a(I,h)
求和
h
j
不同的所有
h
得到

您的代码没有执行您所声明的操作。您希望沿列(即跨行)求和。此外,你为什么跳过了第一栏。根据您的要求,正确的线路是

B = bsxfun(@minus,sum(A,1),A);

大约快4倍。

我假设您要多次调用代码。如果你想用许多不同的矩阵来称呼它A,那么就我所见,你或多或少是运气不佳-mex可以帮你一些忙-你可以通过2或3的因子来加速它,但你基本上是内存受限的


另一方面,如果你正在做一些更微妙的事情,那么这取决于手头的具体问题——也许你可以使用并行工具箱或gpu。

这与你得到它的速度差不多。如果您使用的是R2016b或更新版本,您可以在本机MATLAB代码中将其缩减为
sum(A(:,2:end))-A(:,2:end)
,在高效计算您所要求的方面,这将处于停滞状态。如果你真的想把它推得更快,你可以考虑编写MEX代码,但是这比它的价值要多得多,因为你已经尽可能快地做到了这一点,没有Max。谢谢你们俩。我正在与@bsxfun斗争。也许我不知道如何正确使用它,但它总是以某种方式涉及到我代码中最慢的部分。今天我问了另一个问题。你的代码并没有完全按照你描述的那样。为什么
2:end
?感谢您指出这一点。代码是正确的;这个解释是错误的,这不是我想要的。例如,如果
A=[11;10;01;00]
,那么
B=[11;01;10;00]
。你的代码给了我
C=[11;12;21;22]
,正如我在问题中所说的:我想构造一个维度
MxN
的矩阵
B
,其中
B(I,j)
是通过对
a(h,j)
求和
h
不同于
I
我不理解。如果B(i,j)=A(h,j)与h~=i之和,那么例如B(2,1)应该是A(h,1)与h~=2之和,即:A(1,1)+A(3,1)+A(4,1),它应该是1(如C中的)而不是0(如B中的)。对不起,我的错误!代码是正确的,我写的解释是错误的!!