在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
sizemxn
,其中一般元素是A{I,j}
。我想要矩阵B
sizemxn
其中一般元素B{I,j}
生成a{I,j}
除以同一列的其他元素之和(j
-th列)
例如,如果A
size3x2
,那么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