2017-03-01 28 views
2

在MATLAB,如果我有兩個3×3矩陣A和B,並希望B的最後兩列複製到前兩個A的,我會用下面的語法:Armadillo C++:如何使用另一個矩陣中的多個元素修改矩陣的多個數組元素,特別是在多維數據集結構中?

A(:,1:2) = B(:,2:3) 

我試圖完成在C++中使用Armadillo的相同動作,專門用於多維數據集結構。在犰狳,如果我有兩個立方體A和B具有九個片(每片是一個3×3矩陣),I假設我會使用以下方法來執行相同的列元素的更新:

A(span(0,2),span(0,1),span(i)) = B(span(0,2),span(1,2),span(i)) 

其中「i」的只是切片索引。該語法基於Armadillo語法指南。

該代碼編譯沒有錯誤並運行;多維數據集切片只是未被更新。我在這裏使用了正確的Armadillo語法,這是執行這些操作的最有效方法嗎?

+0

你的代碼實際上並不編譯。您正在使用錯誤的[subcube](http://arma.sourceforge.net/docs.html#subcube)語法。用'span(i,i)'或'span :: all'替換'i'。第一種形式更新一個切片。第二種形式更新所有切片。 – hbrerkere

+0

@hbrerkere啊,這很有道理,謝謝。代碼正在編譯,因爲我已經在問題中指定了'span(i)'而不是'i'。我會更新這個問題來提一提。 –

+0

語法看起來現在。根據我的測試,這工作。它將相關部分從'B'複製到'A'。你確定你的代碼中沒有其他地方存在bug嗎? – hbrerkere

回答

1

如果你想要一個簡單的複製/粘貼(不是你的立方體矩陣的移位/旋轉),你可以使用這個語法,這樣的伎倆:

#include <armadillo> 

int main (int argc, char* argv[]) 
{ 
    size_t num_slices = 9; 

    arma::icube A (3, 3, num_slices); 
    arma::icube B (3, 3, num_slices); 

    A.zeros(); 
    B.randn(); 

    A.print("Cube A :\n"); 
    B.print("Cube B :\n"); 

    for (int s = 0; s < num_slices; ++s) 
     A.slice(s)(arma::span::all, arma::span(0, 1)) = 
     B.slice(s)(arma::span::all, arma::span(1, 2)); 

    A.print("Cube A :\n"); 
    B.print("Cube B :\n"); 

    return 0; 
} 
相關問題