2016-06-22 10 views
1

私は2549x13倍の配列を持っています(M)。インデックスに対応する値を見つける

例ラインは:

-7.8095 -4.4135 -0.0881 2.5159 6.3142 6.9519 4.9788 2.9109 0.6623 -0.9269 0.3172 1.2445 -0.0730 
4.5819 6.2371 5.8721 6.1824 5.2074 4.8656 5.0269 5.3340 3.6919 1.3608 -0.5443 0.2871 -1.2070 
-6.2273 -3.7767 1.1829 2.8522 3.2428 0.5261 -3.5535 -7.7743 -8.4391 -9.8188 -6.0503 -5.8805 -7.7700 
-2.2157 -3.2100 -4.4400 -3.5898 -0.8901 3.4061 6.5631 7.2028 4.3082 -0.7742 -5.0963 -3.1837 0.4372 
5.5682 5.5393 3.4691 0.6789 1.7320 4.4472 3.7622 1.0194 -0.5362 -3.1721 -6.1281 -6.3959 -6.1932 
0.9707 -0.2701 -3.8883 -8.8974 -7.0375 -1.5085 5.4171 6.0831 2.9852 -2.3474 -4.5637 -3.7378 1.3236 
-2.811 0.0164 2.7208 5.7862 7.3344 8.3504 9.0635 8.4271 2.7669 -2.1403 -2.2003 -0.9940 0.7729 
4.2382 3.3532 3.5475 7.9209 11.7933 14.3181 13.6289 12.9553 13.7464 14.1331 14.3814 16.7949 15.9003 
-0.0539 -2.7059 -3.8141 -2.7531 -1.7465 0.9190 2.2220 0.7268 1.5436 1.0426 2.3535 3.0269 6.4798 

また、私は必要とするいくつかの値のインデックス、2549x5二重(INDE)を有します。

例ライン:

4 5 6 7 8 
0 1 2 3 4 
3 4 5 6 7 
6 7 8 9 10 
-1 0 1 2 3 
6 7 8 9 10 
5 6 7 8 9 
10 11 12 13 14 
11 12 13 14 15 

私は実際の値を持つ新しい配列/マトリックスを作成するために、今したいです。したがって、配列Mを見つけるには、インデックスに対応する値を使用します。

ただし、索引(の場合は)が0の場合、その行のindeces 1,2,3,4に対応する値を取得したいと考えています。 インデックスが-1または15の場合、新しい配列/マトリックスにNaNを挿入したいと考えています。 インデックスが14の場合は、10,11,12,13に対応する値を取得したいと考えています。 だから私は取得したいと思います:

2.5159 6.3142 6.9519 4.9788 2.9109 
NaN  4.5819 6.2371 5.8721 6.1824 
1.1829 2.8522 3.2428 0.5261 -3.5535 
3.4061 6.5631 7.2028 4.3082 -0.7742 
NaN 
-1.5085 5.4171 6.0831 2.9852 -2.3474 
7.3344 8.3504 9.0635 8.4271 2.7669 
14.1331 14.3814 16.7949 15.9003 NaN 
NaN 

これを助けることができる人には非常に感謝。

+0

あなたの質問には多くの問題があります。まず第一に、MATLABはゼロになるインデックスを特定しません。したがって、あなたの条件の1つが無効です。私はあなたが最初のインデックスを意味すると仮定します。その後、あなたの望むマトリックスにはいくつか問題があります。 2行目は最後の列に要素がありません。同じことが8行目の問題です。すなわち、その第1列に要素がない。 &NAは何ですか?それは1x5の行ベクトルですか? 私はあなたの望ましい結果がNA'はすべて 'NaN'の行であることを考慮'とランダムに第二&第8行に欠けている要素を満たす生産することができますよ!上記の問題を明らかにすると答えを投稿します。 –

+0

@Sardar_Usama Reインデックス:私がしたのは、各行の行列* M *の最大値を特定することでした。 '[Peak Ind] = max(M、[]、2);'次に、最大値の前後に2つの値を考慮する必要がありました。 'inde = bsxfun(@ plus、Ind、-2:2);'これが私がインデックスでゼロを得る理由です。 – dede

+0

@Sardar_Usama希望の行列:私が望むものは、最大値の前後2つの値です。しかし、* inde *にインデックスが0の場合は、最大値が第2列の行列* M *にあることを意味します。したがって、私は最大値に先行する1つの値と最大値に続く2つの値だけを考慮する必要があります。このため、2行目の最後の値が欠落しています。 8行目と同じです。ここでは、最大値は2番目の最後の列にあります。したがって、私は最大値に先行する2つの値と、最大値に続く1つの値を考慮する必要があります。 8行目の最初の値が欠落しているのはこのためです。 – dede

答えて

2

は、これはあなたに必要な配列を与えます私は詰め込むときにそこに漂流することを嫌って2しかし、私は期待された結果が何であるか不明でしたrの異なる数の列がindeの場合は、それも懸念されます。おそらくfloor(cols/2)?)

MATLABを使用して、等しくない長さの行を持つ行列を持つことが許可されませんので、-1または15のインデックスがされた行のために、私はすべてのNaN値の行を挿入しました。これは明らかに、if句の中の行を変更することによって、好きなものに変更することができます。あなたの例からMindeを使用して

結果:

P =  
    2.51590 6.31420 6.95190 4.97880 2.91090 
     NaN 4.58190 6.23710 5.87210 6.18240 
    1.18290 2.85220 3.24280 0.52610 -3.55350 
    3.40610 6.56310 7.20280 4.30820 -0.77420 
     NaN  NaN  NaN  NaN  NaN 
    -1.50850 5.41710 6.08310 2.98520 -2.34740 
    7.33440 8.35040 9.06350 8.42710 2.76690 
    14.13310 14.38140 16.79490 15.90030  NaN 
     NaN  NaN  NaN  NaN  NaN 
2

EDIT

は、私はそれを扱うことが困難であるセル構造になるので、あなたのマトリックスに数字や文字を混在しないようお勧めします。 私は残りの答えのために、データを変更したいところにゼロ(またはエラー値-999が使用されることがある)を入れたいとします。 と仮定すると、私はあなたのインデックス行列をあなたのデータ行列とです:

B=zeros(size(i)); 
for j=1:size(i,1) 
    if (prod(i(j,:))==0) 
     k=find(i(j,:)==0); 
     B(j,k+1:end)= A(j,i(j,k+1:end)); 
     m=find(i(j,:)<0); 
     if (~isempty(m)) 
      B(j,:)= 0; 
     end 
    else 
    B(j,:)= A(j,i(j,:)); 
    end 
end 

私が取得:(

rows = size(M, 1);     % number of rows in M and inde 
cols = size(inde, 2);    % number of columns in inde 
N = [nan(rows, 2) M nan(rows, 2)]; % pad M with 2 columns of NaN values 
            % on left and right 
inde = inde + 2;      % change indices to account for padding 
P = zeros(rows, cols);    % preallocate result matrix 
nanrow = nan(1, cols);    % make a row of all NaN values 


for row_num = 1:rows 
    P(row_num,:) = N(row_num, inde(row_num,:)); % get values from N 
    if sum(isnan(P(row_num,:))) > 1 % if 2 NaN values, original index was -1 or 15 
     P(row_num,:) = nanrow;   % so make it all NaN's 
    end 
end 

2.5159 6.3142 6.9519 4.9788 2.9109 
     0 4.5819 6.2372 5.8722 6.1824 
1.1830 2.8522 3.2429 0.5261 -3.5535 
3.4061 6.5632 7.2028 4.3083 -0.7742 
    0   0   0   0   0 
-1.5086 5.4171 6.0831 2.9853 -2.3475 
7.3344 8.3505 9.0635 8.4271 2.7670 
+0

私はこのコードを実行しようとすると、エラーが表示されます 'インデックス行列dimensions.' – dede

+0

を超えるループ停止jは以降行列Bが64 64からに等しい場合ワーキングゼロでいっぱいになり、上記のエラーが表示されます。 – dede

+0

私は質問が更新されました.0と-1の2つの例外があります(インデックスが14または15の場合)。 – dede

関連する問題