2015-09-26 106 views
1

值我有一個矩陣,我想創建一個新的排序,例如,矩陣運算MATLAB走動

vals = [1 2; 3 4] 

我也有兩個矩陣,一個new_x和new_y這樣new_x(a,b) = jnew_x(a,b) = k意味着我想vals(a,b)的值被映射到new_vals(j,k)。

例如,給定

new_x = [1 2; 2 1] 
new_y = [2 2; 1 1] 

我願意 new_vals = [4 3; 1 2]

據我所知,我可以只寫兩個for循環來構建新的數組,但matlab非常擅長提供整個基礎上的操作。我的問題是,如何在沒有for循環的情況下構建new_vals?

+0

從你的描述我不明白輸出'new_vals',你能解釋它一步一步或添加for循環實現? – Daniel

+1

@Daniel我認爲從'new_x'和'new_y'計算出的線性指數要追溯到從'1到numel(vals)'的線性指數。這有點像映射回來,如果我說得對。 – Divakar

+0

@Daniel ..或追溯到'1到numel(vals)'的排序版本。 – Divakar

回答

1

基本上你是想獲得一個矩陣,當與new_xnew_y索引會給我們vals,即 -

output(new_x(1,1),new_y(1,1))必須等於vals(1,1)

output(new_x(1,2),new_y(1,2))必須等於vals(1,2)等。

我們將盡力在稍後進行驗證。現在,這裏是一個使用linear indexing一個解決方案 -

nrows = size(vals,1); %// Store number of rows 

%// Calculate linear indices 
idx = (new_x + (new_y-1)*nrows); 

%// Trace/map back to sorted version of "1:numel(vals)" 
[~,traced_back_idx] = sort(idx(:));  

%// Index into vals with traced back linear indices & then reshape & transpose 
out = reshape(vals(traced_back_idx),[],nrows).' 

下面是另一個,可能更快捷的方式 -

out = nan(size(vals)); 
out((new_x + (new_y-1)*nrows)) = vals; 
out = out.' 

正如前面覈查討論,讓我們索引outnew_xnew_y和應匹配了vals。這裏有一個代碼,這樣做 -

for ii = 1:size(out,1) 
    for jj = 1:size(out,2) 
     check_back(ii,jj) = out(new_y(ii,jj),new_x(ii,jj)); 
    end 
end 

樣品試驗 -

案例#1(樣品被從提問):

vals = 
    1  2 
    3  4 
new_x = 
    1  2 
    2  1 
new_y = 
    2  2 
    1  1 
new_vals = 
    4  3 
    1  2 
out = 
    4  3 
    1  2 
check_back = (must be same as vals) 
    1  2 
    3  4 

案例#2:

vals = 
    1  2  5 
    3  4  5 
    6  8  3 
new_x = 
    1  2  3 
    3  1  2 
    3  2  1 
new_y = 
    2  2  3 
    2  1  1 
    1  3  3 
out = 
    4  5  6 
    1  2  3 
    3  8  5 
check_back = (must be same as vals) 
    1  2  5 
    3  4  5 
    6  8  3 
0

我想我明白你在這裏想要做什麼。 new_x和new_y只是new_val矩陣rigth的座標?問題是THA你正在嘗試僅做工程的載體,而不是爲基質,所以唯一的辦法就是矩陣變換成一個向量,重新排序的值,然後返回到矩陣,如:

vals = [1 ,2; 3, 4]; 
    A=reshape(vals,1,4); % A is a vector [ 1  3  2  4] 
    new_coord=[2,3,4,1];   
    B(new_c)=A; %B is [4  1  3  2] 
    new_val=reshape(B,2,2) %back to matrix 

Obtainig new_val = [4 3; 1 2]。另外B = A(new_c)也是允許的,但是座標不同,eventhoug很容易以這種方式來考慮rigth座標。

我相信一定有辦法包括一個new_x矩陣,改造一切都變成new_coord