2010-10-13 59 views
12

x=1:100N=1:10。我想創建一個矩陣x^N以便i列包含條目[1 i i^2 ... i^N]矢量化連續功率矩陣的創建

我可以很容易地使用for循環做到這一點。但有沒有辦法使用矢量化代碼來做到這一點?

+4

+1有機會看到所有這些不同的方法。 – zellus 2010-10-13 21:38:05

回答

11

我會去:

x = 1:100; 
N = 1:10; 
Solution = repmat(x,[length(N)+1 1]).^repmat(([0 N])',[1 length(x)]); 

另一種解決方案(可能更有效):

Solution = [ones(size(x)); cumprod(repmat(x,[length(N) 1]),1)]; 

甚至:

Solution = bsxfun(@power,x,[0 N]'); 

希望這有助於。

+0

+1。如果你可以緊湊地表達規則,那麼這個組合可能會讓你在MATLAB中表達它... – 2010-10-13 13:43:04

+0

+1 for bsxfun()voodoo。 @Adrien,我認爲有一個錯字:N = 1:10;而不是N = 1:0; – zellus 2010-10-13 14:00:40

+0

@zellus:true,錯字更正 – Adrien 2010-10-13 21:25:44

2

不知道它是否真的適合您的問題。

bsxfun(@power, cumsum(ones(100,10),2), cumsum(ones(100,10),1)) 

編輯: 正如阿德里安指出的那樣,我的第一次嘗試是不符合OP問題。

xn = 100; 
N=10; 
solution = [ones(1,xn); bsxfun(@power, cumsum(ones(N,xn),2), cumsum(ones(N,xn),1))]; 
+0

computex矩陣的第一行應該是1,對於bsxfun +函數指針+簡單參數,您的情況爲'1:100' – Adrien 2010-10-13 10:20:24

5

由於您的矩陣是沒有那麼大,最直接的辦法做到這一點是使用MESHGRIDelement-wise power operator.^

[x,N] = meshgrid(1:100,0:10); 
x = x.^N; 

這將創建一個11-通過-100矩陣,其中每個列i包含[i^0; i^1; i^2; ... i^10]

+2

不錯的meshgrid用法。我在這裏提出的這個方法和類似的問題唯一的問題是它們不使用第i行以低成本計算第i + 1行。該cumprod變種做到這一點,但缺少一些美學。 – Adrien 2010-10-13 21:44:50

+0

@Adrien:對於大型矩陣,你說得對,通過連續乘以基值來計算值可能會更快。對於像這裏的例子那樣的相對較小的矩陣,似乎是一個合理的折衷方案,可以輕鬆閱讀和理解,但效率稍低。 ;) – gnovice 2010-10-14 00:42:20

+0

我喜歡這種方法......在我的實際編程中,我創建了10000 10000.所以,也許我應該使用更高效的方法。很高興知道這種方式。謝謝! – alext87 2010-10-14 07:53:46

6

聽起來像範德蒙德矩陣。所以使用vander

A = vander(1:100); 
A = A(1:10, :); 
+0

唯一的問題是VANDER創建矩形矩陣,所以你做了很多額外的工作。 – gnovice 2010-10-13 16:11:23

+0

@gnovice:解決問題不是一個非常棘手的問題,請參閱上面的代碼。 – 2010-10-13 16:12:06

+0

實際上,由於OP提到在評論中使用方形矩陣,所以這個函數看起來是一個不錯的選擇。你必須做的唯一改變是使用[ROT90](http://www.mathworks.com/help/techdoc/ref/rot90.html)來旋轉它,以使'i'列包含'i ':A = rot90(vander(1:N));' – gnovice 2010-10-14 15:23:33

1

爲什麼不使用一個容易理解的循環?

c = [1:10]'; %count to 100 for full scale problem 
for i = 1:4; %loop to 10 for full scale problem 
    M(:,i) = c.^(i-1) 
end 

需要更多的思考去理解人們已經顯示的這個代碼的聰明的矢量化版本。我更像是一個野蠻人做事的方式,但任何閱讀它的人都會理解它。

我更喜歡簡單易懂的代碼。

(是的,我可以預先分配,不值得爲這樣的小案例降低清晰度。)

+2

如果你要做一個循環,那麼你應該一行一行地填寫矩陣,而不要使用。^運算符。相反,填寫第一行,然後用'[1:100]'乘以前一行來創建每一行。那麼你就可以提高可讀性和效率。 – Adrien 2010-10-13 21:49:25

+2

Adrien的建議產生12%的速度增加。對於這裏討論的問題的規模來說,它是不可察覺的。我必須運行這10萬次,才能讓整個事情花費2.8到2.5秒。對我來說,我的版本更易於閱讀,因爲M沒有啓動步驟,但沒有考慮到味道! :) – MatlabDoug 2010-10-15 13:21:20