2015-09-24 45 views
1

我試圖將一個函數應用於向量,其中每個新行都應用了相同的函數,但變量發生了變化。因此,舉例來說,如果我有N行向量:逐行向向量應用函數

A = [1.2; 1.5; 1.8; 2.3; 2.7; 2.8; 2.9]; 

我想減去n*0.1從每行那裏n = row number了。因此,第2行中的1.5將被減去0.2 (2*0.1),第6行中的2.8將被減去0.6 (0.1*6),依此類推。

爲了澄清,我想這對我的檔案上寫着一個函數,確定這是n行,我想n乘以0.1減去在n行數。我希望代碼能夠逐行讀取文件,以便最終結果是向每行執行上述操作的向量。我認爲需要一個循環?

我確定解決方案很簡單,但我不知道該怎麼做。

回答

5

我相信這應該做的伎倆:

A 
    1.2000 
    1.5000 
    1.8000 
    2.3000 
    2.7000 
    2.8000 
    2.9000 

b = A-(1:numel(A)).'*0.1 
b = 
    1.1000 
    1.3000 
    1.5000 
    1.9000 
    2.2000 
    2.2000 
    2.2000 

它所做的是它創建了價值1:numel(A),所以[1; 2; 3 ...]列向量,然後通過0.1乘以每個值。這個矢量然後從原始矢量中減去。

如您所見,在那裏有一個點,.'。這裏並不是真的有必要,但最好包含它。如果沒有這個小點,'會產生一個conjugate transpose,而不是regular one。當然,轉置將水平矢量轉換爲垂直矢​​量。

爲了滿足Divakar,誰可以做晚餐,只使用bsxfun, permute and reshape在同一時間蓋房子:

如果你想用一個矩陣來做到這一點,而不是,你可以使用repmat,或meshgrid,或者多更真棒bsxfun,像這樣:

A = magic(5); 

b = bsxfun(@minus, A, [1:size(A,1)].'*0.1) 
b = 
    16.9000 23.9000 0.9000 7.9000 14.9000 
    22.8000 4.8000 6.8000 13.8000 15.8000 
    3.7000 5.7000 12.7000 19.7000 21.7000 
    9.6000 11.6000 18.6000 20.6000 2.6000 
    10.5000 17.5000 24.5000 1.5000 8.5000 

更多維度?合併bsxfunpermute

+1

和'bsxfun' for * proper * matrix case,雖然沒有被問到! – Divakar

+0

Es Perfecto吧! – Divakar

+2

哈哈可愛的評論關於晚餐和房子,也許豪宅有一天;) – Divakar