Синтаксис вектора в матрицу в MATLAB - PullRequest
2 голосов
/ 23 июня 2009

Есть ли способ объединить 2 вектора в MATLAB так, чтобы:

mat = zeros(length(C),length(S));
for j=1:length(C)
    mat(j,:)=C(j)*S;
end

Использование обычного синтаксиса MATLAB, аналогичного:

mat = C * S(1:length(S))

Это дает «Внутренние размеры матрицы должны согласовываться с ошибкой», потому что она пытается выполнять нормальные операции с матрицами. Это не стандартная операция линейной алгебры, поэтому я не уверен, как правильно выразить ее в MATLAB, но, похоже, это должно быть возможно без использования цикла, который в MATLAB слишком медленный.

Ответы [ 6 ]

5 голосов
/ 23 июня 2009

Из вашего описания это звучит как простая матричная операция. Вы просто должны убедиться, что у вас есть правильные размеры для C и S . C должен быть вектором столбца ( длина (C) -by-1), а S должен быть вектором строки (длина 1 × ) (S) ). Предполагая, что они являются правильными размерами, просто сделайте следующее:

mat = C*S;

Если вы не уверены в их размерах, это должно сработать:

mat = (C(:))*(S(:)');

РЕДАКТИРОВАТЬ: На самом деле, я немного с ума сошел с скобками. Некоторые из них не нужны, так как нет проблем с порядком работы. Вот более чистая версия:

mat = C(:)*S(:)';

ПОЯСНЕНИЯ:

Оператор умножения матриц в MATLAB будет производить либо внутренний продукт (что приведет к скалярному значению), либо внешний продукт (что приведет к матрице) в зависимости от размеров векторов, к которым он применяется.

Последнее уравнение, приведенное выше, создает внешний продукт из-за использования оператора двоеточия для изменения размеров векторных аргументов. Синтаксис C (:) преобразует содержимое C в один столбец-вектор. Синтаксис S (:) ' преобразует содержимое S в вектор-столбец, а затем переносит его в вектор-строку. При умножении это приводит к матрице размера ( длина (C) -by- длина (S) ).

Примечание: Это использование оператора двоеточия применимо к векторам и матрицам любого измерения, что позволяет вам преобразовывать их содержимое в один столбец-вектор (что облегчает некоторые операции, как показано этот другой ТАК вопрос ).

4 голосов
/ 23 июня 2009

Попробуйте выполнить это в MATLAB:

mat = C*S'

Как в:

C = [1; 2; 3];
S = [2; 2; 9; 1];

mat = zeros(length(C),length(S));
for j=1:length(C)
    mat(j,:)=C(j)*S;
end

% Equivalent code:
mat2 = C*S';

myDiff = mat - mat2
2 голосов
/ 23 июня 2009

Вы имеете в виду следующее?

mat = zeros(length(C),length(S));
for j=1:length(C)
    mat(j,:)=C(j)*S;
end

Если это так, то это просто матричное умножение:

C' * S    % if C and S are row vectors
C * S'    % if C and S are column vectors

Если вы не знаете, являются ли C и S векторами строк или векторов столбцов, вы можете использовать трюк, чтобы превратить их в векторы столбцов, а затем транспонировать S перед умножением их:

C(:) * S(:)'
1 голос
/ 24 июня 2009

Попробуйте это:

С = 1: 3 S = 1: 5 mat1 = C '* S

mat2 = bsxfun (@times, C ', S)

(особенно, если нужная функция не проще, чем MATLAB)

- Loren

1 голос
/ 23 июня 2009

Мне не совсем понятно, что вы делаете - похоже, ваша результирующая матрица будет состоять из length(C) строк, где i -я строка - это вектор S, масштабированный по i запись C (поскольку при подписке на вектор получается скаляр). В этом случае вы можете сделать что-то вроде

mat = repmat(C,[1 length(S)]) .* repmat(S, [length(C) 1])

где вы размещаете C по столбцам и S по строкам.

0 голосов
/ 23 июня 2009

Попробуйте использовать сетку:

[Cm, Sm] = meshgrid(C, S);
mat = Cm .* Sm;

edit: неважно, умножение матриц тоже подойдет. Вам просто нужен один вектор-столбец C и один вектор-строка S. Затем выполните C * S.

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