2016-11-30 17 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] 

,我想爲B C到失去的開頭有一些元素,使得他們最終的長度爲5個元素,就像一個,來實現:

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

我該怎麼做?

編輯/ UPDATE:

我已經接受了@excaza,誰寫的名爲 「naivetrim」 一個不錯的功能提出了答案。我保存的功能作爲.M腳本,然後用它:首先,我定義我的三個數組,併爲@excaza表明,被調用的函數:

[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 

如果您擁有大量陣列,那麼使用替代中間存儲數據類型(如cellsstructures)可能會更好,這會更「簡單」地分配和迭代。


一些不同的類似方法的時間代碼可以在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!這似乎是通過使用函數進行修剪的一種巧妙方式。但我不得不承認我無法遵循如何實施(由於我的知識水平),所以我無法驗證它。從你發送的鏈接中,我以爲我忘了輸入一些重要的東西,但似乎「函數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

相關問題