Векторно-матричный синтаксис в MATLAB
Вопрос
Есть ли способ объединить 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 является чрезмерно медленным.
Решение
Судя по вашему описанию, это звучит как простая матричная операция.Вам просто нужно убедиться, что у вас есть подходящие размеры для C и S. C должен быть вектор-столбец (длина (C)-by-1) и S должен быть вектор строки (1-by-длина (Ы)).Предполагая, что это правильные размеры, просто выполните следующие действия:
mat = C*S;
Если вы не уверены в их размерах, это должно сработать:
mat = (C(:))*(S(:)');
Редактировать: На самом деле, я немного свихнулся со скобками.Некоторые из них не нужны, поскольку не имеют отношения к порядку работы.Вот более чистая версия:
mat = C(:)*S(:)';
ОБЪЯСНЕНИЕ:
Тот Самый оператор умножения матриц в MATLAB будет выдано либо внутренний продукт (приводящий к скалярному значению) или наружный продукт (в результате получается матрица) в зависимости от размеров векторов, к которым она применяется.
Последнее приведенное выше уравнение дает внешний продукт из-за использования оператор двоеточия чтобы изменить размеры векторных аргументов.Синтаксис C(:) изменяет содержание C в вектор с одним столбцом.Синтаксис S(:)' изменяет содержание S в вектор-столбец, затем преобразует его в вектор-строку.При умножении это приводит к матрице размера (длина (C)-по-длина (Ы)).
Примечание: Это использование оператора двоеточия применимо к векторам и матрицам любой размерности, позволяя вам преобразовать их содержимое в вектор с одним столбцом (что упрощает некоторые операции, как показано на этот другой вопрос SO).
Другие советы
Попробуйте выполнить это в 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
Вы имеете в виду следующее?
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(:)'
Мне не совсем понятно, что вы делаете - похоже, ваша результирующая матрица будет состоять из строк length (C)
, где строка i
th является вектором S
, масштабированным с помощью i
-ой записи в C
(поскольку при подписке на вектор получается скаляр). В этом случае вы можете сделать что-то вроде
mat = repmat(C,[1 length(S)]) .* repmat(S, [length(C) 1])
где вы размещаете C
по столбцам и S
внизу строк.
Попробуй это:
C = 1:3 S = 1:5 mat1 = C'*S
mat2 = bsxfun(@times, C', S)
(особенно.хорошо, когда нужная вам функция не является более простой нотацией MATLAB)
--Лорен
Попробуйте использовать сетку:
[Cm, Sm] = meshgrid(C, S);
mat = Cm .* Sm;
edit: неважно, умножение матриц тоже подойдет. Вам просто нужен один вектор столбца C и один вектор строки S. Затем выполните C * S.