2017-01-08 87 views
1

我怎樣才能做到這一點更一般?Matlab在矩陣的特定元素上分配值

XD_L數組是手工介紹。

% Data 
Xd_L = [10 100 1000]; 
C = zeros(length(Xd_L)) 

% Calc 
C12 = -1/Xd_L(1); 
C13 = -1/Xd_L(2); 
C11 = abs(C12+C13); 

C21 = C12; 
C23 = -1/Xd_L(3); 
C22 = abs(C21+C23); 

C31 = C13; 
C32 = C23; 
C33 = abs(C31+C32); 

% Result: 
C = [C11 C12 C13; C21 C22 C23; C31 C32 C33] 
+0

什麼您_more general_意思?這段代碼的目的是什麼? – EBH

+0

類似於:'for i = 1:length(Xd_L)'和'for j = 1:length(Xd_L)''C(i,j)=' – BOB

+0

我想要更一般,因爲在我的例子中,矩陣C有23x23維度,並且確定CI的元素需要編寫529個公式。 – BOB

回答

1

下面是一個通用的情況下,一種方法 -

function out = scale_assign(Xd_L) 

m = numel(Xd_L); 
n = ceil(sqrt(2*m)); 
off_diag_vals = -1./Xd_L; 
[y,x] = find(tril(true(n),-1)); 

out = zeros(n,n); 
out(sub2ind(size(out),y,x)) = off_diag_vals; 
out(sub2ind(size(out),x,y)) = off_diag_vals; 
out(1:n+1:n^2) = abs(sum(out,2)); 

樣品試驗 -

>> Xd_L = [10 100 1000]; 
>> scale_assign(Xd_L) 
ans = 
     0.11   -0.1  -0.01 
     -0.1  0.101  -0.001 
     -0.01  -0.001  0.011 
>> Xd_L = [10 100 1000 10000 100000 1000000]; 
>> scale_assign(Xd_L) 
ans = 
     0.111   -0.1  -0.01  -0.001 
     -0.1  0.10011  -0.0001  -1e-05 
     -0.01  -0.0001  0.010101  -1e-06 
     -0.001  -1e-05  -1e-06  0.001011 
+0

非常好,謝謝! – BOB

+0

如果'numel(Xd_L)'> 6我有錯誤,你知道爲什麼嗎? – BOB

+0

@Marius如果我理解正確,'Xd_L'中元素的數量必須是從size(nchoosek(1:M,2),1)'中獲得的特定數字,其中M是輸出的大小矩陣。因此,這些具體的數字將是:'3','6','10','15'等等。這是否有道理,或者我誤解了你的問題? – Divakar