2015-07-14 2 views
1

Обычно матрица имеет 2 размера, но, по-видимому, не существует предела для числа измерений, которое может иметь матрица в MATLAB.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 

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

ответ

7

Вы могли бы назвать zeros так:

x = zeros([2 2 2 2]) 

Таким образом, вы можете настроить массив ввода, как вы хотите.

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

D = 5; 
x = zeros(zeros(1, D) + 2) 
+0

Это нечестиво. +1. – rayryeng

0

я могу думать, делать это только с условными, например .:

dim = input('Enter dimensions'); 

if dim == 2 
    x = zeros(5,5); 
else if dim == 3 
    x = zeros(5,5,5); 

...etc 
end 
+0

Да, технически правильно, но это не совсем то, что я имел в виду. – wvdz

1

ответ Рафаэля ударяет ноготь на голове. Но есть и общий способ делать такие вещи, даже если функция не имеет перегрузки для чего-то вроде векторного ввода, как в случае с 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 

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

Edit:

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

imginfo = { rand(40), [0 1], 'Colormap', colormap(jet) }; 
figure, imshow(a{:}); 
+0

Я не понимаю, в чем преимущество этого подхода, используя вектор. – wvdz

+0

В Matlab не каждая функция имеет векторную перегрузку, например, «нули». Использование ячеек - универсальный способ вызова функции с неизвестным количеством аргументов во время выполнения. т.е. указанный выше подход работает для каждой функции в Matlab, тогда как Rafael работает только для функций, которые принимают вектор в качестве аргумента. Единственная причина, по которой я опубликовал это, - это то, что раньше мне приходилось использовать этот подход в коде, поэтому я решил опубликовать его для всех, кто может быть заинтересован. – Justin

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