У меня 100 массивов размером nx1. n варьируется от одного массива к другому (например, n1 = 50, n2 = 52, n3 = 48 и т. Д.). Я хотел бы объединить все эти массивы в один с размером 100 x m, где m является максимальным из n.

Проблема, с которой я сталкиваюсь, заключается в том, что при изменении n Matlab выдает ошибку, говорящую о несоответствии размеров. Есть ли способ обойти это, чтобы я мог заполнить "отсутствующую" ячейку с помощью N / A? Например, если первый массив содержит 50 элементов (т. Е. n1 = 50) следующим образом:

23    
31  
6  
...  
22   

Второй массив содержит 52 элемента (т. е. n2 = 52), например:

25    
85  
41  
...  
8  
12  
66   

Результат должен быть:

23 25  
31 85  
6 41   
... ...  
22 8  
N/A 12  
N/A 66 

Заранее спасибо сообществу!

0
A.Rainer 25 Авг 2021 в 19:53

2 ответа

Лучший ответ

Вы можете рассмотреть возможность использования структурных массивов для хранения таких наборов данных по мере необходимости. упрощает все при объединении их в единый массив.

Но чтобы ответить на ваш вопрос, если у вас есть такие массивы:

a1 = 1:20; % array of size 1 x 20
n1 = numel(a1); % 20
a2 = 50:60; % array of size 1 x 11
n2 = numel(a2); % 11
... say you have nArrs arrays

Например, для массивов nArrs вы можете создать желаемую матрицу res следующим образом:

m = max([n1, n2, .... ]);

res = ones(m,nArrs) * nan; % initialize the result matrix w/ nan

% Manually
res(1:n1,1) = a1.';
res(1:n2,2) = a2.';
% ... so on

% Or use eval instead like this
for i = 1:nArrs
  eval(['res(1:n' int2str(i) ', i) = a' int2str(i) '.'';'])
end

Теперь имейте в виду, что использование eval - это НЕ рекомендуется, но, надеюсь, это просто даст вам представление о том, что делать. Если вы использовали структуры, вы можете заменить eval чем-то более эффективным и надежным, например arrayfun, например.

0
Person.Woman.Man.Camera.TV 25 Авг 2021 в 17:42

Вот еще один подход без eval.

array_lengths = cellfun(@numel, arrays);
max_length = max(array_lengths);

result = nan(max_rows, num_arrays);

for r=1:num_arrays    
    result(1:array_lengths(r),r) = arrays{r}(1:array_lengths(r));
end

Некоторое объяснение: я предполагаю, что ваши массивы хранятся в ячейке для начала. Вот код для создания фиктивных данных с указанными вами размерами:

% some dummy data for your arrays.  
num_arrays = 100;
primerArrayCell = num2cell(ones(1,num_arrays)); % , 1, ones(1, num_arrays));
arrays = cellfun(@(c) rand(randi(50, 1),1), primerArrayCell, 'uniformoutput',false);

Вы можете использовать cellfun с анонимной функцией, чтобы получить длину каждого отдельного массива:

% Assume your arrays are in a cell of arrays with the variable name arrays
array_lengths = cellfun(@numel, arrays);
max_length = max(array_lengths);

Выделите массив значений nan для хранения вашего результата

% initialize your data to nan's.
result = nan(max_rows, num_arrays);

Затем введите значения, отличные от наночастиц, на основе длины массивов, рассчитанной ранее.

for r=1:num_arrays    
    result(1:array_lengths(r),r) = arrays{r}(1:array_lengths(r));
end
1
informaton 25 Авг 2021 в 19:52