我正在尝试在 C# 中声明和使用 XNA 向量进行矩阵乘法、求和等。
这些将用于图像处理,使其比常规的 SetPixel 和 GetPixel 更快。但是,我总是找不到有效的示例,并且我在网上尝试了很多示例,但似乎我遗漏了一些东西。
任何帮助和示例代码?
谢谢!
我正在尝试在 C# 中声明和使用 XNA 向量进行矩阵乘法、求和等。
这些将用于图像处理,使其比常规的 SetPixel 和 GetPixel 更快。但是,我总是找不到有效的示例,并且我在网上尝试了很多示例,但似乎我遗漏了一些东西。
任何帮助和示例代码?
谢谢!
如果您担心性能,那么您可以恢复到 unsafe
上下文编码。
通过使用 unsafe 关键字标记类型、类型成员或语句块,您可以使用指针类型并在该范围内的内存上执行 C++ 样式的指针操作,并且能够在托管执行框架内执行此操作。不安全的代码可以比相应的安全实现运行得更快。
这是一个不错的简短示例,来自 C# 4.0 in a Nutshell 一书:
unsafe void BlueFilter (int[,] bitmap)
{
int length = bitmap.Length;
fixed (int* b=bitmap)
{
int* p=b;
for (int i=0, i<length; i++)
*p++ &= 0xFF;
}
}
(来源)
除此之外,您还应该看看这个 SO Question
Verctors 只是 1 xn 矩阵。创建一个带有求和和乘法方法的 Matrix 类。
public class Matrix
{
private int[,] m_array;
public Matrix(int m, int n)
{
m_array = new int[m, n];
}
public Matrix(int[,] other)
{
m_array = other;
}
public Matrix Mult(Matrix other)
{
if (this.m_array.GetLength(1) != other.m_array.GetLength(0))
return null;
int[,] res = new int[this.m_array.GetLength(0), other.m_array.GetLength(1)];
for (int i = 0; i < this.m_array.GetLength(0); ++i)
for (int j = 0; j < other.m_array.GetLength(1); ++j)
{
int s = 0;
for (int k = 0; k < this.m_array.GetLength(1); ++k)
s += this.m_array[i, k] * other.m_array[k, j];
res[i, j] = s;
}
return new Matrix(res);
}
}