2012-01-13 59 views
0

我想用一个矩阵M(mxn)乘以随机数向量PT(n)=rand(1,n),但想要为每个列乘法有不同的随机向量。在Matlab中可能吗?每次迭代乘以随机数

E.g. PT=rand(1,4);

`PT*(1 0 0 0;... 
    0 0 0 1;... 
    0 1 0 0;... 
    0 0 0 1); 

但是其中PT为每列乘法改变。我能想到的唯一方法是制作PT=rand(4,4),然后采用diag(PT*M),但如果我的矩阵M很大,则它非常昂贵。
有什么想法?使用@Nasser arrayfun代码

干杯

Suplemental 时间比一个for循环3次。我认为这是正常的,但为什么最大的区别?

+0

你不能用'M'乘以''1'x矢量N' x'n'矩阵。而不是你所描述的只是导致一个随机向量呢? – 2012-01-14 05:47:59

回答

1

我不知道我是否完全明白你在问什么。

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

例如:在这里,我们乘以5×4的矩阵与3个向量,每个是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) 

给出

r = 

    [5x1 double] [5x1 double] [5x1 double] 

cell2mat(r) 

ans = 

    0.1463 0.4386 0.4638 
    0.4104 0.8105 0.6455 
    0.9503 1.0145 1.0369 
    1.3011 1.4583 1.5233 
    0.4688 0.7405 0.7492 
+0

这很有趣,但仍然比我需要更多的数据。我只需要排在最前面,所以不想制作一个巨大的矩阵。我可以指定在arrayfun中乘以哪些行,例如: PT(:,i)* M(i,:) – HCAI 2012-01-13 11:36:02

+0

我认为这个小小的修改就是正确的: r = arrayfun(@(i)M(i,:)* pt(:,i),1 :size(pt,2),'UniformOutput',false) – HCAI 2012-01-13 12:23:33

+0

好的,如果这对你有用。但是,以上是现在向量乘法的向量(您将行向量乘以列向量)。你在你的问题中表示你想用一个向量乘一个矩阵。无论哪种方式,很乐意提供帮助。 – Nasser 2012-01-13 21:22:44

0

我可以肯定,但根据你的例子,它看起来像你想做一个随机排列的PT列。如果是这样的话,你可以这样做:

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

这使数组中的列置换,但是我可以使每个列乘以M(:,i)后向量PT(1,4)的值随机变化吗? – HCAI 2012-01-13 12:26:47

0

如果我跟着你,怎么样

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

不错!是的,可以解决问题而不需要循环。事实上,我一直在寻找的是'PT'。* M'。奇怪的是,思维如何阻挡最简单的解决方案。它实际上在代码的其他部分也进行了简化!再次感谢! – HCAI 2012-01-14 09:43:26