假设我有两个矩阵(以 Common Lisp 数组的形式) foo 和 bar ,这样:
(defvar foo #2A((2 1 6) (7 3 4)))
(defvar bar #2A((3 1) (6 5) (2 3)))
Run Code Online (Sandbox Code Playgroud)
我想使用 BLAS 执行矩阵乘法,而不使用 Matlisp、GSLL、LLA 等包装器。这样我就得到一个包含结果的数组:
#2A((24 25) (47 34))
Run Code Online (Sandbox Code Playgroud)
我应该采取哪些步骤来执行此类操作?
我的理解是,我应该从 REPL 调用 BLAS 矩阵乘法函数,并将我的参数 foo 和 bar 传递给它。
在 R 中,我可以轻松地这样做:
foo %*% bar
Run Code Online (Sandbox Code Playgroud)
我怎样才能在 Common Lisp 中做到这一点?
免责声明:1)我使用 SBCL 2)我不是经验丰富的计算机科学家
假设我有一个矩阵Eigen::Matrix<double, 3, 3>,其条目是
1 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)
我怎样才能将其扩展为
1 2 3 0
4 5 6 0
7 8 9 0
0 0 0 1
Run Code Online (Sandbox Code Playgroud)
我需要它来将 3D 仿射/投影变换(4 x 4,在 Eigen::Transform 类型下)与 3D 旋转矩阵(3 x 3)相乘。
我有维度为 的矩阵 A500x2000x30和维度为 的矩阵 B 30x5。
您可以认为有 500 个实例,因为2000x30矩阵 A 的维度为500x2000x30。
我想将1x2000x30A 中的每个与矩阵 B 相乘以获得大小为 的新矩阵1x2000x5。
即A X B应该给我一个维度矩阵500x2000x5
显然,通过矩阵 A 循环 500 次是一个解决方案,但是有没有有效的方法来实现这一点?
编辑:A和B都是numpy数组
我正在尝试将两个 numpy 数组作为矩阵相乘。我期望 ifA是一个n x m矩阵并且B是一个m x p矩阵,那么A*B会产生一个n x p矩阵。
此代码创建一个 5x3 矩阵和一个 3x1 矩阵,如shape属性所验证。我小心翼翼地创建了两个二维数组。最后一行执行乘法,我期望一个 5x1 矩阵。
A = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4],[5,5,5]])
print(A)
print(A.shape)
B = np.array([[2],[3],[4]])
print(B)
print(B.shape)
print(A*B)
Run Code Online (Sandbox Code Playgroud)
结果
[[1 1 1]
[2 2 2]
[3 3 3]
[4 4 4]
[5 5 5]]
(5, 3)
[[2]
[3]
[4]]
(3, 1)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-38-653ff6c66fb7> in <module>()
5 print(B)
6 print(B.shape)
----> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 R 中的 %*% 函数将矩阵(由少数 1 和大部分 O 组成)与向量相乘,此过程需要大量时间。有什么办法可以让它更快吗?
谢谢
假设我有四个矩阵,a、b、c和d。
在Python(使用numpy)中,我需要将result = np.matmul(np.matmul(np.matmul(a,b),c),d)它们相乘。
在 MATLAB/GNU Octave 中,我可以用更简单的方式将它们相乘result = a*b*c*d。
有没有什么方法可以在Python中进行矩阵相乘,这样我就不必重复编写np.matmul避免嵌套括号?
因此,我试图编写一个程序来使用多个线程进行矩阵乘法,然后绘制所用时间和所用线程数之间的图表。我使用了以下方法:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
pthread_mutex_t lock;
#define M 200
#define N 300
#define P 400
#define X 2 // Number of Threads
#define RED "\x1b[31m"
#define GREEN "\x1b[32m"
int A[M][N], B[N][P], C[M][P], D[M][P];
int row = 0;
void *matrixMulti(void *arg)
{
pthread_mutex_lock(&lock);
int i = row++;
for (int j = 0; j < P; j++)
{
C[i][j] = 0;
for (int k = 0; k < N; k++)
{
C[i][j] += …Run Code Online (Sandbox Code Playgroud) 我做了一个简单的模型,但似乎不起作用。我收到此错误:“太多方程,超定系统。该模型有 6 个方程和 2 个变量”并且sum_vs = sum_vs + v[1] * A[1,1] 的大小为 1 但0 个变量 ()。
我整个早上都在盯着这段代码,这是一个简单的例子,因为我想让它在未来变得更复杂(更大的维度)。这是代码:
model MatrixMultiplication
parameter Real A[2,2]=[1,2;1,2];
parameter Real v[2]={1,2};
parameter Real sum_vs=0; //counter
Real vs[2];
equation
for i in 1:2 loop
for j in 1:2 loop
sum_vs = sum_vs + v[j] * A[i,j];
end for;
vs[i]=sum_vs;
end for;
end MatrixMultiplication;
Run Code Online (Sandbox Code Playgroud)
理想的结果是vs[1,2]=A[2,2]*v[2];
谢谢!
在下面的代码(Jupiter笔记本)中,输出给出了错误,如何纠正代码?
import numpy as np
A = [1,22,231,1540]
B = [[-1,1,0],[1,-1,1],[0,6,0],[0,6,0]]
C = [[113401201],[10649],[1]]
result = np.dot(np.dot(A, B),C)
print(result)
Run Code Online (Sandbox Code Playgroud)
输出
[-1800609408]
Run Code Online (Sandbox Code Playgroud)
实际答案是
我想找到错误并改正
假设我有一个矩阵A = rand(2,14,24)和一个向量x = 10*1(1,14)
我想要A和x的元素乘法,使得对于所有j = 1,2,...,B(i,j,k)= A(i,j,k)*x(j).我希望能够在不运行循环的情况下完成此操作.在matlab中执行此操作的最有效方法是什么?