2017-09-07 373 views
1

我有一個任意矩陣,a = [1, 0, 0, 1]MATLAB用另一個矩陣替換矩陣的某些值

我想用另一個矩陣b = [1, 2, 3]的值替換每個0值,並且每個值都用另一個矩陣的值c = [3, 4, 5]替換。

因此,我會結束矩陣[3, 4, 5, 1, 2, 3, 1, 2, 3, 3, 4, 5]

我試過找到0和1值的索引,並用b和c替換那些索引的值,但這是不允許的,因爲它們不是相同的大小。有沒有簡單的方法來實現這一點?

+0

'b'和'c'會有相同的尺寸嗎? –

回答

3

鑑於

a = [1, 0, 0, 1]; 
b = [1, 2, 3]; 
c = [3, 4, 5]; 

讓我們先來我們想在最後的矩陣陣列,並把他們在單元陣列:

parts = {b, c} 
parts = 
{ 
    [1,1] = 
    1 2 3 
    [1,2] = 
    3 4 5 
} 

的目標是使用的a值作爲索引到parts,但要做到這一點,我們需要所有的值從1到一些n(如果有缺失的值,它將需要更多的工作)是積極的。在這種情況下,我們可以只增加a

a_inds = a + 1 
a_inds = 
    2 1 1 2 

現在我們可以通過做parts(a_inds)一個新的單元陣列,或基體加入cell2mat

result = cell2mat(parts(a_inds)) 
result = 
    3 4 5 1 2 3 1 2 3 3 4 5 
+1

我正在寫這篇文章:-) –

+2

@LuisMendo我看到了,偷走了你的答案。忍者布偶! ;) – beaker

0

這也可以一鍵完成:價值地圖。

a = [1, 0, 0, 1]; 
b = [1, 2, 3]; 
c = [3, 4, 5]; 

keyset = [1,0]; 
valueset = {b,c}; 

mapobj = containers.Map(keyset,valueset); 
new_vec = []; 
for i =1:length(a) 
    new_vec(length(new_vec)+1:length(new_vec)+length(mapobj(a(i))))= mapobj(a(i)); 
end 

1被映射到b0映射到c。 for循環遍歷a構建一個包含映射值的更長的向量。

此代碼將允許非連續的鍵,以便可以將37添加並映射到另一個向量,而在上一個答案中,您必須將2映射到下一個向量才能使代碼不中斷。

相關問題