这些是我在项目中进行矩阵计算的一些代码.
它们是两个类方法和一个实例方法,用于创建矩阵并执行矩阵乘法运算.
matrics multiplication的方法效果不好,其结果是错误的.
+ (NSMutableArray *)arrayOfWidth:(NSInteger)width andHeight:(NSInteger)height {
return [[self alloc] initWithWidth:width andHeight:height];
}
- (id)initWithWidth:(NSInteger)width andHeight:(NSInteger)height {
if((self = [self initWithCapacity:height])) {
for(int i = 0; i < height; i++) {
NSMutableArray *inner = [[NSMutableArray alloc] initWithCapacity:width];
[self addObject:inner];
}
}
return self;
}
+ (NSMutableArray *)matrixA:(NSMutableArray *)matrixA multiplyMatrixB:(NSMutableArray *)matrixB {
int aRow = [matrixA count];
int aColumn = [[matrixA objectAtIndex:0] count];
int bRow = [matrixB count];
int bColumn = [[matrixB objectAtIndex:0] count];
NSMutableArray *newArray = [NSMutableArray arrayOfWidth:aRow …Run Code Online (Sandbox Code Playgroud) 这是我的代码,非常简单,我无法相信它不起作用.
pckint = imread('pckint.jpg');
F = fft2(pckint);
Fcon = conj(F);
S = F*Fcon;
Run Code Online (Sandbox Code Playgroud)
现在,根据分配方向和我对主题的理解,我应该在我的功率谱'S'中获得真正的价值.但是,我正在获得复杂的价值观.
对不起,对于Matlab来说,我是一个完整的菜鸟,但我已经尝试过搜索和理解我用过的所有命令,但无济于事.请帮忙!
我的BinvA矩阵的(1,1)条目得到一个非常奇怪的值我
只是试图反转B矩阵并做一个(B ^ -1)A乘法.
我明白,当我手工计算时,我的(1,1)应该是0,但我得到的是1.11022302e-16.我该如何解决?我知道浮点数不能完全准确地表示,但为什么这给我这样一个不准确的响应而不是四舍五入到有没有办法让它更精确?
她是我的代码:
import numpy as np
A = np.array([[2,2],[4,-1]],np.int)
A = A.transpose()
B = np.array([[1,3],[-1,-1]],np.int)
B = B.transpose()
Binv = np.linalg.inv(B) #calculate the inverse
BinvA = np.dot(Binv,A)
print(BinvA)
Run Code Online (Sandbox Code Playgroud)
我的打印声明:
[[ 1.11022302e-16 -2.50000000e+00]
[ -2.00000000e+00 -6.50000000e+00]]
Run Code Online (Sandbox Code Playgroud) python floating-point numpy matrix-multiplication floating-point-precision
我需要乘以两个大矩阵,X并且Y.通常X具有~500K行和~18K列,并Y具有~18K行和~18K列.X预计矩阵是稀疏的,并且矩阵Y预计是稀疏/密集的.在Scala/Apache Spark中执行此乘法的理想方法是什么?
scala sparse-matrix large-data matrix-multiplication apache-spark
我n*n在 Xeon 处理器系统上使用 C 和 FORTRAN运行矩阵乘法代码。我很惊讶地看到两种方法之间的实时差异。为什么 FORTRAN 代码给了我更快的执行时间?我在dgemm()C 代码中使用并调用了相同的函数。我尝试运行更改循环顺序的通用 C 代码并尝试使用不同的标志来优化模拟过程。我无法达到使用dgemm().
FORTRAN 代码 - dgemm():
#include "stdio.h"
#include "time.h"
#include "sys/time.h"
#include "math.h"
#include "stdlib.h"
long long readTSC(void)
{
/* read the time stamp counter on Intel x86 chips */
union { long long complete; unsigned int part[2]; } ticks;
__asm__ ("rdtsc; mov %%eax,%0;mov %%edx,%1"
: "=mr" (ticks.part[0]),
"=mr" (ticks.part[1])
: /* no inputs */
: "eax", "edx");
return ticks.complete;
}
volatile double gtod(void) …Run Code Online (Sandbox Code Playgroud) 我是使用 LAPACK/BLAS 的新手。我想计算一个方程的解:
AU=F
我想知道这部分代码的逻辑错误是什么。我使用求解器输入大小为 ((xdiv-1) (ydiv-1),(xdiv-1) (ydiv-1)) 的矩阵 A。然后,随后求解方程。U=逆(A)* f。
其中 U 和 f 大小相同。(u((xdiv-1) (ydiv-1),1),f((xdiv-1) (ydiv-1),1))。执行矩阵求逆时出现分段错误错误。
这是我的代码:
program main
double precision, allocatable :: A(:,:)
double precision, allocatable :: u(:,:), f(:,:)
double precision mesh(2), dx, dy
integer xdiv, ydiv
xdiv=55
ydiv=55
mesh(1)=.001
mesh(2)=.001
dx=mesh(1)
dy=mesh(2)
allocate (A((xdiv-1)*(ydiv-1),(xdiv-1)*(ydiv-1)))
allocate (Ainv((xdiv-1)*(ydiv-1),(xdiv-1)*(ydiv-1)))
allocate (u((xdiv-1)*(ydiv-1),1),f((xdiv-1)*(ydiv-1),1))
do i =1,(xdiv-1)*(ydiv-1)
A(i,i)=-2.d0*(1.d0/(dx**2)+1.d0/(dy**2))
enddo
do i=1,(xdiv-2)
do j=1,(ydiv-1)
A(i+(j-1)*(xdiv-1),i+(j-1)*(xdiv-1)+1)=1.d0/(dx**2)
A(i+(j-1)*(xdiv-1)+1,i+(j-1)*(xdiv-1))=1.d0/(dx**2)
enddo
enddo
do i=1,(xdiv-1)
do j=1,(ydiv-2)
A(i+(j-1)*(xdiv-1),i+(j)*(xdiv-1))=1.d0/(dy**2)
A(i+(j)*(xdiv-1),i+(j-1)*(xdiv))=1.d0/(dy**2)
enddo
enddo
do i=1,(xdiv-1)
do j=1,(ydiv-1)
xcoord = (i-1)*mesh(1) …Run Code Online (Sandbox Code Playgroud) void multiply(int a[], int row1, int col1, int b[], int row2, int col2) {
int d[size];
for (int i = 0; i < row1; i++) {
for (int j = 0; j < col2; j++) {
int sum = 0.0;
for (int k = 0; k < col2; k++)
sum = sum + a[i * col1 + k] * b[k * col2 + j];
d[i * col2 + j] = sum;
}
}
for (int i = 0; i < …Run Code Online (Sandbox Code Playgroud) 我需要用MATLAB计算这个等式:
哪里Sn可以是矩阵或标量,我试图用它
S_A = S_3*S_5*((ones-(S_1*S_5)).^(-1))*S_2+S_4
Run Code Online (Sandbox Code Playgroud)
问题是它没有给我正确的结果和它似乎与差异的问题
但我无法理解为什么给我错误的结果.
结果应该是这个
但是MATLAB的结果是
我不明白为什么这两个结果不一样.我想到的唯一方法是通过这个
diff = ones-(S_1*S_5);
if S_1*S_5 == zeros %Perchè senza non funziona?
diff = ones;
else
diff = (ones-(S_1*S_5)).^(-1)
end
S_A = S_3*S_5*diff*S_2+S_4;
Run Code Online (Sandbox Code Playgroud)
但我不认为这是一个聪明的解决方案.谁知道为什么我没有得到正确的结果?
我正在尝试编写C ++代码以使用SIMD进行矩阵乘法,但是结果是错误的,这是我的代码
void mat_sse(DATA m1[][SIZE], DATA m2[][SIZE], DATA mout[][SIZE])
{
DATA prod = 0;
__m128 X, Y, Z, M, N;
for(int i=0; i<SIZE; i=i+1){
Z[0] = Z[1] = Z[2] = Z[3] = 0;
for(int k=0; k< SIZE; k=k+4){
for( int j=0; j<SIZE; j=j+4){
X = _mm_load_ps(&m1[i][k]);
Y = _mm_load_ps(&m2[k][j]);
M = _mm_mul_ps(X, Y);
Z = _mm_add_ps(M, N);
mout[i][j] += Z[0];
mout[i][j+1] += Z[1];
mout[i][j+2] += Z[2];
mout[i][j+3] += Z[3];
}
}
}
return ;
}
Run Code Online (Sandbox Code Playgroud)
const int SIZE = 40; …