как создать очень большую матрицу с помощью matlab

У меня есть проблема с matlab, когда я пытаюсь создать матрицу с очень большим размером такой как 40000x40000.

например:

x=zeros (40000,40000);

сообщение об ошибке"??? Максимальный переменный размер, позволенный программой, превышен".

есть ли любое решение.

Также у меня есть другой вопрос, можем мы иметь матрицу с размером переменного столбца такой как в Java.

8
задан osama alia 2 February 2010 в 11:14
поделиться

6 ответов

40000 * 40000 * 8 байт на число = 12 ГБ, вам наверняка не хватит памяти.

Чтобы создать огромную матрицу с множеством нулей, вам понадобится разреженная матрица :

m = sparse(40000, 40000)

Чтобы создать массив вариантов, вы можете использовать массив ячеек :

m = cell(3, 1)
m(1) = [1,2,3]
m(2) = [2,4,6,8,10]
m(3) = 6+6i
16
ответ дан 5 December 2019 в 06:37
поделиться

Есть много вещей, которые вы можете сделать, поскольку разные ответы указывают. Правильный ответ зависит от вашей реальной проблемы. Создание грубой силы такого большого массива невозможно без 64-битной версии MATLAB PLUS достаточно памяти, чтобы сохранить этот большой массив или хранение массива каким-то другим способом. Вы можете хранить в автономном режиме массива, только приносящий то, что вам нужно, насколько вы его используете.

Например, если эти цифры всегда будут небольшими целыми числами, затем используйте UINT8 или INT8 или логический массив, даже один массив, все из которых уменьшит требования к памяти по сравнению с двойными массивами. Или используйте редкую форму хранения в целом. Многое зависит от того, что вы будете делать с массивом.

Насколько доступно переменное количество элементов в строке, используйте массив ячейки здесь, а не плоский традиционный массив.

4
ответ дан 5 December 2019 в 06:37
поделиться
121 --- 2224524-

Если вам действительно нужна матрица, которую большой, вы можете использовать Parallel Toolbox распределенный вычислительный сервер MATLAB ), чтобы использовать память нескольких машин одновременно. Это позволило бы вам написать:

matlabpool open <a large number>
x = distributed.zeros( 40000, 40000 );

см. Также: Док для кодристых массивов

3
ответ дан 5 December 2019 в 06:37
поделиться

40k*40k => 1.6*10^9 Числа. Я верю, что нули вернут поплавки. Так что вам понадобится около 1.6*10^9 флоатов *4 байта/Плот => 6.4 Гб оперативной памяти только для этой Переменной...

Ты уверен, что тебе нужен такой большой массив?

1
ответ дан 5 December 2019 в 06:37
поделиться

Я не думаю, что это полезно. Рассмотрим: вы определили класс, Bar:

class Bar {
public:
    void frob();
};

Теперь вы объявляете класс Foo:

class Foo;

Все, что вы можете сделать с Foo, это построить указатель на него. Теперь предположим, что вы добавляете информацию о том, что Foo является производным от Bar :

class Foo: public Bar;

Что вы теперь можете сделать, что вы не могли сделать раньше? Я думаю, что все, что вы можете сделать, это принять указатель на Foo и поместить его в указатель на Bar , затем использовать этот указатель.

void frob(Foo* f) {
    Bar *b = (Bar)f;
    b->frob();
}

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

void frob(Bar* b) {
    b->frob();
}
-121--962073-

40000 * 40000 * 8 байт на число = 12 ГБ, наверняка вам не хватит памяти.

Чтобы создать огромную матрицу с большим количеством нулей, вам нужна разреженная матрица :

m = sparse(40000, 40000)

Для создания массива вариантов можно использовать массив ячеек :

m = cell(3, 1)
m(1) = [1,2,3]
m(2) = [2,4,6,8,10]
m(3) = 6+6i
-121--3545568-

нет, ну да купите больше барана, как указано ниже. Разрежение просто удаляет нулевые элементы.

И в matlab вы можете просто добавить новые col/rows к матрице, чтобы сделать большую матрицу.

Но вы имеете в виду, можно ли иметь матрицу, где один столбец равен 10 строкам, а другой - 20, например. Нет, ты не можешь этого сделать. Не думал, что ты сможешь на Яве.

0
ответ дан 5 December 2019 в 06:37
поделиться

Это не строение, но я предпочитаю использовать классы типов для обобщения Булевы операции предикатам любой арности:

module Pred2 where

class Predicate a where
  complement :: a -> a
  disjoin    :: a -> a -> a
  conjoin    :: a -> a -> a

instance Predicate Bool where
  complement = not
  disjoin    = (||)
  conjoin    = (&&)

instance (Predicate b) => Predicate (a -> b) where
  complement = (complement .)
  disjoin f g x = f x `disjoin` g x
  conjoin f g x = f x `conjoin` g x


-- examples:

ge :: Ord a => a -> a -> Bool
ge = complement (<)

pos = (>0)
nonzero = pos `disjoin` (pos . negate)
zero    = complement pos `conjoin` complement (pos . negate)

Я люблю Хаскелла!

-121--3572375-

Предполагая, что вы используете RadioSelect в качестве виджета для forms.ChoeyField , вы можете сделать что-то вроде:

choices = (('1', 'First help_text here'),
           ('2', 'Second help_text here'),
           ('3', 'Third help_text here'),
          )

class MyForm(forms.Form):
    ...
    choice = forms.ChoiceField(widget = RadioSelect, choices = choices)

Это не строгое использование help _ text , но это должно сделать работу в большинстве случаев.

-121--3713280-

Я думаю, что использовать файлы жесткого диска для хранения данных - лучший выбор

0
ответ дан 5 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: