2015-08-19 5 views
1

Я должен добавить несколько массивов вместе в цикле for, и массивы будут иметь очень большой размер, поэтому иногда мне нужно будет прокладывать для массива x, и иногда мне нужно будет проложить для array y, как я могу динамически массировать массивы?Динамические динамические массивы с нулями - Octave/Matlab

Я знаю, как ручка вручную (см. Код ниже), но как я могу сделать это динамически, если размер массива x или размер массива y будет отличаться?

x = [1 2 3 4 5 6]' 
y = [3 5 7 8]'; 

A = x + [y;zeros(2,1)]; 

This will result in A = [4 7 10 12 5 6]' 

PS: Я использую октаву 3.8.1 с, как MATLAB

ответ

3

Найдите максимальную длину и проложите их по разности.

L = max(length(x), length(y)); 
A = [x; zeros(L-length(x),1)] + [y; zeros(L-length(y),1)]; 

Он легко может быть расширен до более чем двух векторов:

L = max(length(x), length(y), length(z)); 
A = [x; zeros(L-length(x),1)] + [y; zeros(L-length(y),1)] + [z; zeros(L-length(z),1)]; 
0
x = [1 2 3 4 5 6]' 
y = [3 5 7 8]'; 

L1 = length(x); 
L2 = length(y); 
if L1>L2 
    A = x + [y;zeros(L1-L2,1)]; 
elseif L2>L1 
    A = x + [y;zeros(L2-L1,1)]; 
else 
    A = x + y; 
end 

Это следует проверить длину обоих массивов и колодки, тем меньше один к размеру большего.

1

На самом деле, вы не должны раздуть массивы, чтобы добавить их. Вы можете сделать что-то вроде:

% Just some random arrays 
A = rand(1, 10); 
B = rand(1, round(rand(1,1)*10)+1); 

% Then add them 
if length(A) < length(B), C = A + B(1:length(A)); 
else C = B + A(1:length(B)); 

% Or... 
C = A(1:max(length(A), length(B))) + B(1:max(length(A), length(B))); 

Что я предлагаю, просто используйте элементы, которые имеют значение. Это означает, что вам не нужно добавлять нули в массив, но просто добавить все элементы короткого vector с таким же количеством элементов из большего размера vector.

Единственная причина нулевой колодки векторов, чтобы сделать использование sum() функции MATLAB для массива размеров NxM.

Смежные вопросы