Matlab: Могу ли я создать матрицу с неизвестным количеством измерений?

Обычно матрица имеет 2 измерения, но, похоже, в MATLAB нет ограничений на количество измерений, которые может иметь матрица.

Например, чтобы создать 4-мерную матрицу, я могу сделать это:

>> x = zeros(2,2,2,2)

x(:,:,1,1) =

     0     0
     0     0


x(:,:,2,1) =

     0     0
     0     0


x(:,:,1,2) =

     0     0
     0     0


x(:,:,2,2) =

     0     0
     0     0

Есть ли способ создать матрицу, число измерений которой известно только во время выполнения?


person wvdz    schedule 14.07.2015    source источник


Ответы (2)


Вы можете вызвать zeros следующим образом:

x = zeros([2 2 2 2])

Следовательно, вы можете настроить входной массив по своему усмотрению.

Например: для создания матрицы 2x2x2x2x2 (где D = 5, количество измерений):

D = 5;
x = zeros(zeros(1, D) + 2)
person Rafael Monteiro    schedule 14.07.2015

Ответ Рафаэля бьет в самую точку. Но есть также общий способ сделать это, даже если функция не имеет перегрузки для чего-то вроде векторного ввода, как в случае zeros. Вы можете использовать массив cell следующим образом:

>> dims = {2,2,2,2};
>> zeros(dims{:})
ans(:,:,1,1) =

     0     0
     0     0


ans(:,:,2,1) =

     0     0
     0     0


ans(:,:,1,2) =

     0     0
     0     0


ans(:,:,2,2) =

     0     0
     0     0

Я нашел этот подход очень полезным для других функций.

Изменить:

Этот подход более надежный. Вот еще один пример:

imginfo = { rand(40), [0 1], 'Colormap', colormap(jet) };
figure, imshow(a{:});
person Justin    schedule 14.07.2015
comment
Я не понимаю, в чем преимущество этого подхода по сравнению с использованием вектора. - person wvdz; 15.07.2015
comment
В Matlab не каждая функция имеет векторную перегрузку, например zeros. Использование ячеек — это универсальный способ вызова функции с неизвестным количеством аргументов во время выполнения. то есть вышеприведенный подход работает для каждой функции в Matlab, тогда как подход Рафаэля работает только для функций, которые принимают вектор в качестве аргумента. Единственная причина, по которой я опубликовал это, заключается в том, что мне приходилось использовать этот подход в коде раньше, поэтому я решил опубликовать его для всех, кому это может быть интересно. - person Justin; 15.07.2015