Инициализировать матрицу MATLAB на основе индексов - PullRequest
4 голосов
/ 24 октября 2010

Я пытаюсь создать матрицу M, удовлетворяющую:

M(i,j) = f(i,j)

для некоторого f.Я могу сделать поэлементную инициализацию, скажем, M = zeros(m,n), затем цикл.Например (в октаве):

M = zeros(m,n)
for i = 1 : m
  for j = 1 : n
    m(i, j) = (i+j)/2;
  endfor
endfor

Но циклы AFAIK не являются оптимальным способом использования MATLAB.Есть намеки?

1 Ответ

3 голосов
/ 24 октября 2010

Конечно!

 xi = 1:m;
 xj = 1:n;
 Ai = repmat(xi',1,length(xj));
 Aj = repmat(xj,length(xi),1);
 M = f(Ai,Aj);

Вы можете сделать это с любым f(), если он принимает аргументы матрицы и выполняет поэлементную математику.Например: f = @(i,j) (i+j)/2 или для умножения: f = @(i,j) i.*j Матрица Ai имеет идентичные элементы для каждой строки, матрица Aj имеет идентичные элементы для каждого столбца.Функция repmat() повторяет матрицу (или вектор) в большую матрицу.

Я также отредактировал вышеприведенное, чтобы абстрагировать векторы xi и xj - они у вас естькак 1:m и 1:n векторов, но они могут быть произвольными числовыми векторами (например, [1 2 7.0 pi 1:0.1:20])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...