2012-01-13 241 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