Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 矩阵维数_Matlab_Matrix - Fatal编程技术网

Matlab 矩阵维数

Matlab 矩阵维数,matlab,matrix,Matlab,Matrix,我是matlab新手,不知道你们能不能帮我解决这个问题 例如,我有两个矩阵: A = [X1 X2 X3 X4] B = [Y1; Y2; Y3] 现在我真正想要实现的是用这种方式乘以这两个矩阵: [X1Y1 X2Y1 X3Y1 X4Y1; X1Y2 X2Y2 X3Y2 X4Y2; X1Y3 X2Y3 X3Y3 X4Y3; .... and so on] 我试着使用A(1,:).*B(:,1),但matlab说矩阵维数必须一致 我只是不知道如何在matlab上处理这个问题,但在ex

我是matlab新手,不知道你们能不能帮我解决这个问题

例如,我有两个矩阵:

A = [X1 X2 X3 X4]

B = [Y1; Y2; Y3]
现在我真正想要实现的是用这种方式乘以这两个矩阵:

[X1Y1 X2Y1 X3Y1 X4Y1; 
 X1Y2 X2Y2 X3Y2 X4Y2;
 X1Y3 X2Y3 X3Y3 X4Y3;
 .... and so on]
我试着使用
A(1,:).*B(:,1)
,但matlab说矩阵维数必须一致


我只是不知道如何在matlab上处理这个问题,但在excel中是可能的。

我想你只需要转置一个向量。将列向量(a(1,:)与行向量(B(:,1))相乘。这应该起作用:

C = A(1,:).*B(:,1)';

在Matlab中有
*
*
两种语言,它们非常不同

*
是您想要的标准矩阵乘法,即
B*A
,注意
B
必须放在第一位,因为内部尺寸必须匹配。可以将一列乘以一行,但不能将一行乘以一列(除非它们的元素数相同)


*
是元素对元素的乘法,在这种情况下,矩阵的大小和形状必须完全相同,例如[1 2 3].[4 5 6]=[1*4 2*5 3*6]=[4 10 18]

这是一个简单的外积。克朗是不需要的(尽管它会起作用。)bsxfun是疯狂的滥杀滥伤,尽管它会满足你的要求。repmat是不合适的,因为虽然它可以帮助您做您想做的事情,但它会复制内存中的阵列,使用的资源比需要的更多。(当有好的编程风格可供您使用时,请避免使用低效的编程风格。)

您只需要使用simple*运算符

A是一个行向量。B列向量

C = B*A
将产生结果C(i,j)=B(i)*A(j),这正是您要寻找的结果。请注意,这是因为B是3x1,A是1x4,所以B和A的“内部”尺寸是一致的

在MATLAB中,如果您不确定某些东西是否有效,请尝试它

A = [1 2 3 4];
B = [1;2;3];
C = B*A
ans =
     1     2     3     4
     2     4     6     8
     3     6     9    12
请看kron确实起作用了,尽管我敢打赌这里使用kron的效率可能比简单的外积乘法要低

C = kron(B,A)
C =
     1     2     3     4
     2     4     6     8
     3     6     9    12
同样,bsxfun也可以在这里工作,尽管由于我们使用的是一个通用工具来完成一些基本操作符可以完成的事情,我敢打赌它的效率会稍低一些

C = bsxfun(@times,B,A)
C =
     1     2     3     4
     2     4     6     8
     3     6     9    12
最糟糕的选择是repmat。同样,由于它首先人工复制内存中的向量,因此对于大向量,它必须走出去获取大块内存

C = repmat(B,1,4).*repmat(A,3,1)
C =
     1     2     3     4
     2     4     6     8
     3     6     9    12
我想为了完整起见,您也可以使用meshgrid或ndgrid。请注意,它所做的正是repmat所做的,但在这里它显式地创建了新的矩阵。同样,当有好的工具可以完全按照您的意愿进行操作时,这是一种糟糕的编程风格

[BB,AA] = ndgrid(B,A)
BB =
     1     1     1     1
     2     2     2     2
     3     3     3     3
AA =
     1     2     3     4
     1     2     3     4
     1     2     3     4

C = BB.*AA
C =
     1     2     3     4
     2     4     6     8
     3     6     9    12
您需要了解的是,为什么这些工具中的每一个都可以用于此项工作,以及它们为什么不同。

不要执行“
*
”操作。你应该做一个“
*
”。 “
*
”用于逐索引乘法,如果向量大小相等,则应该为您提供[X1Y1 X2Y2 X3Y3]。
如果你做规则乘法“
*
”,这实际上是矩阵乘法。

你试过从右边乘A吗?B().A()你可以对一行和一列进行一个元素对一个元素的乘法,Matlab并不介意(我想,我实际上并不是100%在这方面,也不是在Matlab周围进行测试。倍频程广播所以不能用它来检查)。但在这种情况下,问题是
A
有4个元素,而
B
只有3个元素。OP所追求的是传统的矩阵乘法,即
B*A
我实际上在matlab会话(2010A)中尝试过这一点,但在尝试执行A(1,:)*B(:,1)时确实出现了错误。但是你是对的,OP似乎还有别的意思:)+1,特别是对于MATLAB中的语句,如果你不确定某些东西是否有效,试试它!因此,似乎被那些宁愿花20分钟写一个问题,花上几个小时等待答案,也不愿花20分钟玩来玩去自己找出答案的人所压倒。@HighPerformanceMark不,你绝对不能。试试这个:
A=[1,2,3,4];B=[1;2;3];A*B您将得到内部矩阵尺寸必须一致的错误。但是
B*A
运行正常。这是因为在第二种情况下,内部尺寸都是1,但在第一种情况下,您试图乘以4x3,这是矩阵乘法的定义无法做到的。@HighPerformanceMark是的,如果(但仅当)它们具有相同数量的元素,您就可以这样做。我将修改答案。但在这个例子中,你不能。