Matlab 每次迭代乘以随机数

Matlab 每次迭代乘以随机数,matlab,Matlab,我想将一个随机数向量PT(n)=rand(1,n)乘以一个矩阵M(mxn),但希望每个列乘法都有一个不同的随机向量。在Matlab中可能吗 例如,PT=rand(1,4) 但在这里,每列乘法的PT都会发生变化。我能想到的唯一方法是先做PT=rand(4,4),然后再做diag(PT*M),但是如果我的矩阵M很大的话,这是非常昂贵的。 有什么想法吗 干杯 辅助的 使用@Nasser arrayfun代码所需的时间是for循环的3倍。我知道这很正常,但为什么会有这么大的差异呢?我不确定我是否完全理解

我想将一个随机数向量
PT(n)=rand(1,n)
乘以一个矩阵
M(mxn)
,但希望每个列乘法都有一个不同的随机向量。在Matlab中可能吗

例如,
PT=rand(1,4)

但在这里,每列乘法的PT都会发生变化。我能想到的唯一方法是先做
PT=rand(4,4)
,然后再做
diag(PT*M)
,但是如果我的矩阵M很大的话,这是非常昂贵的。
有什么想法吗

干杯

辅助的
使用@Nasser arrayfun代码所需的时间是for循环的3倍。我知道这很正常,但为什么会有这么大的差异呢?

我不确定我是否完全理解你的要求

但是如果你的意思是你有一个向量矩阵,你想用另一个矩阵乘以这些向量中的每一个,那么一种方法就是使用
arrayfun

例如:这里我们用3个向量乘以一个5乘4的矩阵,每个向量是4乘1

结果是3个向量,每个向量是5乘1

pt = rand(4,3);
M  = rand(5,4);
r  = arrayfun(@(i) M*pt(:,i),1:size(pt,2),'UniformOutput',false)
给予


我不确定,但根据你的例子,看起来你想对PT的列进行随机排列。如果是这样,您可以执行以下操作:

PT=PT(:,randperm(size(PT,2)));

如果我跟着你,你呢

M = rand(4,4);     % your matrix
PT = rand(4,4);    % your random row vectors
rslt = sum(PT'.*M,2); % your desired result

这很有趣,但仍然使
n
的数据比我需要的多出一倍。我只需要排在第一行,所以我不想做一个巨大的矩阵。我可以指定要在该数组中乘法的行吗?例如,PT(:,I)*M(I,:)我想对其进行一个小小的修改:r=arrayfun(@(I)M(I,:)*PT(:,I),1:size(PT,2),'UniformOutput',false)好的,如果这对您有效的话。但上面的是向量与向量的乘法(将行向量与列向量相乘)。你在问题中说你想把一个矩阵乘以一个向量。不管怎样,很高兴能帮上忙。谢谢你仔细的解释。我已经实现了这一点,并最终发现for循环可以节省时间。。。您能否就使用arrayfun而不是循环更好的做法发表意见?谷歌搜索支持速度的说法,但并没有给出一个很好的理由。你怎么认为?Thanksloops现在在Matlab中速度很快(从6.5开始)。但这只是一个造型问题。我喜欢函数式编程,所以arrayfun对我来说很自然。您正在数组上应用函数。所以,任何时候,当你有一个函数,并且列出了你想要应用这个函数的事情时,你可以使用矢量化(如果可能的话),如果没有,那么可以使用循环或者数组函数(当然,除非像bsxfun这样的东西可以做,然后使用它)。在arrayfun中,应用的函数可以是实际函数的句柄,因此它是一个灵活的操作。使用感觉更好的方法(所有条件都相同)。这将排列数组中的列,但我可以使向量PT(1,4)的值在每列与M(:,I)相乘后随机变化吗?你不能将
1
x
n
向量乘以
M
x
n
矩阵。你所描述的不就是一个随机向量吗?很好!是的,这解决了没有for循环的问题。事实上,我一直在寻找的是
PT.*M
。奇怪的是,大脑是如何屏蔽最简单的解决方案的。它实际上在代码的其他部分也做了简化!再次感谢!
PT=PT(:,randperm(size(PT,2)));
M = rand(4,4);     % your matrix
PT = rand(4,4);    % your random row vectors
rslt = sum(PT'.*M,2); % your desired result