在MATLAB中使用给定矩阵生成矩阵

在MATLAB中使用给定矩阵生成矩阵,matlab,matrix,Matlab,Matrix,我有矩阵Asizemxn,其中一般元素是A{I,j}。我想要矩阵Bsizemxn其中一般元素B{I,j}生成a{I,j}除以同一列的其他元素之和(j-th列) 例如,如果Asize3x2,那么b{2,1}=A{2,1}/(A{1,1}+A{1,3}) 如果A=randn(M,N),有人能帮我在Matlab中写这个吗?一个简单的方法是生成一个除数矩阵,然后进行元素除法。除数的元素可以通过对a进行预乘,得到与a中的行数和列数相同的布尔求反单位矩阵。左乘法更容易实现,因为您希望按列求和,而不是按通常的

我有矩阵
A
size
mxn
,其中一般元素是
A{I,j}
。我想要矩阵
B
size
mxn
其中一般元素
B{I,j}
生成
a{I,j}
除以同一列的其他元素之和(
j
-th列)

例如,如果
A
size
3x2
,那么
b{2,1}=A{2,1}/(A{1,1}+A{1,3})


如果
A=randn(M,N)
,有人能帮我在Matlab中写这个吗?

一个简单的方法是生成一个除数矩阵,然后进行元素除法。除数的元素可以通过对
a
进行预乘,得到与
a
中的行数和列数相同的布尔求反单位矩阵。左乘法更容易实现,因为您希望按列求和,而不是按通常的行求和

c = ~eye(size(a, 1)) * a
b = a ./ c

如果您有MATLAB R2016b/倍频程,您可以执行以下操作:

b = a ./ (sum(a) - a);
否则您可以使用
bsxfun

b = a ./ bsxfun(@minus, sum(a), a);
我在我的答案和@MadPhysician提出的解决方案上应用了(八度音阶)一些计时

a=rand(3000,2000);

disp('-------USING EYE----')
tic
x = size(a) ;
c = ~eye(x(1)) * a;
 a ./ c;
toc


disp('-------USING BSXFUN-')
tic
a ./ (sum(a) - a);
toc
结果如下:

-------USING EYE----
Elapsed time is 0.454791 seconds.
-------USING BSXFUN-
Elapsed time is 0.0998709 seconds.

c
的大小是否与
a
的大小相同?当我运行此代码时,会收到大小不匹配的警告。在我的情况下,
a
并不总是一个正方形矩阵。应该这样做,我正在移动,所以给我几分钟时间来验证一些东西a不必是正方形的,但我确实是。我做的是c正方形,而不是和a一样大。谢谢@MadPhysicast