Я думал, что это можно сделать в одну строку, но я ошибался. Смотрите решение ниже:
Учитывая (добавленная строка помогает мне отладить мою индексацию ниже):
>> A = [NaN 1 2 ; 3 NaN 4; NaN 5 6; 7 8 NaN]
A =
NaN 1 2
3 NaN 4
NaN 5 6
7 8 NaN
Тогда:
>> Atrans = A';
>> B = reshape( Atrans(~isnan(Atrans)) ,[],size(Atrans,2))'
B =
1 2
3 4
5 6
7 8
Между прочим, идиома Matlab по выполнению простой логической проверки массива в рамках операции логического индексирования очень распространена и невероятно полезна. Архетипический пример:
>> x(x>0) %This returns a 1D column vector of all values of x
%which are greater than 0, regardless of the initial
%size of x. Multidimensional inputs are unwrapped
%column-first
Все остальное выше - обработка размера и размера.