Вопрос

Есть ли способ объединить 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top