2016-11-30 7 views
0

同じサイズの要素を実現するために、サイズの異なる複数の配列をループし、各配列の先頭からトリミングする方法があるのだろうかと思います各配列に?例えば要素を削除してMatlabの一連の配列をトリミングする方法

、私が持っている場合:

A = [4  3  9  8 13] 
B = [15  2  6 11  1 12  8  9 10 13  4] 
C = [2  3 11 12 10  9 15  4 14] 

をし、私は彼らが達成するために、ちょうどAのように、長さは5つの要素になってしまうような、冒頭にいくつかの要素を失うCをBとします

A = [4  3  9  8 13] 
B = [8  9 10 13  4] 
C = [10  9 15  4 14] 

どうすればよいですか?/UPDATE

EDIT:

私は "naivetrim" と呼ばれる素敵な機能を書いた@excazaによって提案された答えを、受け入れました。私は.Mスクリプトとしてその機能を保存し、それを使用する:@excazaが示唆するように、まず私は、私の3つの配列を定義し、関数と呼ば:私のために働いた

[A, B, C] = naivetrim(A, B, C); 

別の解決策のバリエーションを - @ Sardar_Usamaさんに基づきます下の答え(ループ)。

:それはもう少し簡単でしたので、私は多くの行列が存在しない場合は、それのように行うことができます
A = [4  3  9  8 13] 
B = [15  2  6 11  1 12  8  9 10 13  4] 
C = [2  3 11 12 10  9 15  4 14] 

arrays = {A,B,C} 

temp = min([numel(A),numel(B), numel(C)]); %finding the minimum number of elements 
% Storing only required elements 

for i = 1:size(arrays,2) 
    currentarray = arrays{i} 
    arrays(i) = {currentarray(end-temp+1:end)} 
end 
+0

いくつの配列がありますか? – excaza

+2

'[]'はMATLABの配列/行列に使用され、 '() 'ではありません –

答えて

3

ナイーブループソリューション:

function testcode() 
% Sample data arrays 
A = [4, 3, 9, 8, 13]; 
B = [15, 2, 6, 11, 1, 12, 8, 9, 10, 13, 4]; 
C = [2, 3, 11, 12, 10, 9, 15, 4, 14]; 

[A, B, C] = naivetrim(A, B, C); 
end 

function varargout = naivetrim(varargin) 
% Assumes all inputs are vectors 

% Find minumum length 
lengths = zeros(1, length(varargin), 'uint32'); % Preallocate 
for ii = 1:length(varargin) 
    lengths(ii) = length(varargin{ii}); 
end 

% Loop through input arrays and trim any that are longer than the shortest 
% input vector 
minlength = min(lengths); 
varargout = cell(size(varargin)); % Preallocate 
for ii = 1:length(varargout) 
    if length(varargin{ii}) >= minlength 
     varargout{ii} = varargin{ii}(end-minlength+1:end); 
    end 
end 
end 

返します

A = 

    4  3  9  8 13 


B = 

    8  9 10 13  4 


C = 

    10  9 15  4 14 

配列数が多い場合は、cellsまたはstructuresのような代替の中間記憶データ型を使用する方が、より簡単に割り当ておよび反復処理ができます。


this Gistには、いくつかの異なるアプローチのタイミングコードがあります。

Performance Profile, MATLAB (R2016b) 

Number of Elements in A: 999999 
Number of Elements in B: 424242 
Number of Elements in C: 101325 

Trimming, deletion:  0.012537 s 
Trimming, copying:   0.000430 s 
Trimming, cellfun copying: 0.000493 s 
+0

おかげでexcazaは、素朴なユーザーとして、私はあまり機能に取り組んでいません。私はこれをnaivetrim.mスクリプトとして保存して実行しようとしましたが、何も起こりません。エラーはありませんが、 "A"と入力すると "未定義の関数または変数 'A'が得られます。私が間違っていることを確認していない。 – Spica

+0

[関数への出力を宣言する]必要があります(https://www.mathworks.com/help/matlab/ref/function.html)。 – excaza

+0

ありがとう、excaza!これは、usign関数によってこのトリミングを行う巧妙な方法のようです。しかし、私はそれを実装する方法(私の知識レベルのため)に従うことができなかったことを認めなければならないので、私はそれを検証できません。あなたが送ったリンクから、何か重要な情報を入力するのを忘れてしまったと思っていましたが、実際には関数varargout = naivetrim(varargin)が宣言部分です。 – Spica

2

(私のレベルで、私はコード内で何が起こっているか従うことができます)、同様にこれを言っています
temp = min([numel(A),numel(B), numel(C)]); %finding the minimum number of elements 
% Storing only required elements 
A = A(end-temp+1:end); 
B = B(end-temp+1:end); 
C = C(end-temp+1:end); 
+0

ありがとうSardar_Usama、これはかなり簡単です。私は今、ループとして実装しようとしています – Spica

関連する問題