2013-03-26 50 views
1

說我們有一個載體:矢量與不同步驟線性間隔矢量

dx = [ 1 10 20 ] 

現在,我們想從生成0-100 DX的步驟在DX每個值線性間隔矢量使我們得到如下所示,將其稱爲vals:

vals = 0 0 0 
     1 10 20 
     2 20 40 
     3 30 60 
     . . . 
     . . 100 
     . 100 
     100 

這樣我們就得到了一個不同大小的向量。最終,我們需要將一個函數應用於vals,然後我們需要總結內部向量,以便結果將成爲一個包含3個元素的向量。 這是怎麼回事?

回答

4

您可以arrayfuncellfun解決這個問題:

dx = [1 10 20]; 
vals = arrayfun(@(x)0:x:100, dx, 'UniformOutput', false); 

result = cellfun(@(x)sum(someFunction(x)), vals); 

其中someFunction是要應用到載體的功能。

+0

這就是我一直在尋找!我沒有任何有關arrayfun和cellfun的經驗,所以我將不得不和他們一起玩。謝謝! – 2013-03-26 22:21:30

0

我把結果放在一個列表中,因爲列的大小不一樣,也不適合放在數組中。

dx = [1 10 20]; 
l = 1 + 100 ./ dx; 
% disp(l); % so you can see what the above calculation did 
vals = {linspace(0,100,l(1,1))', linspace(0,100,l(1,2))',linspace(0,100,l(1,3))} 
% the (') after the linspace() function is a matrix transpose since linspace() returns a row vector 
% lists work like matrices except you use list_name{m} as opposed to matrix_name(m,n) 

玩得開心與向量化!

+2

我建議你不要調用你的數組'length',因爲這是一個常用的內建函數的名稱。 – Jonas 2013-03-26 22:07:25

+0

這隻適用於固定長度的dx。我正在尋找可擴展的東西。不管怎麼說,還是要謝謝你! – 2013-03-26 22:22:57

+0

@Jonas感謝您的糾正,我的Octave/Matlab有點生疏。 :) – Nolo 2013-03-28 15:25:17