c#数组基本运算??

Katherine 2012-05-19 09:05:43
两个维数相同的数组a,b,要求各元素相加(或减法,乘法,除法),组成新的数组c,
可不可以直接c=a+b(类似matlab语言)?还是只能遍历各元素相加??
...全文
1126 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
比如说一个线性规划模型类似于 A * x + y = B,其中B是一个n行1列的向量,而A是n行n列的矩阵,y就是此时的初始可行解,然后模型的目标函数也可以表示为矩阵运算,当交换入基和出基变量(某个x和某个y)的时候,就需要计算新的y向量左边的矩阵的逆矩阵,然后分别左乘左右两边的公式,得到新的线性规划模型。直到没有可交换的变量,最后得到的y就是最终的可行解。(大致是这样意思)

使用矩阵,数学家可以三言两语地表达大规模(经济等应用领域)运算的算法,非常方便。所以这类可以直接用运算符重载的表达形式,正是“类似matlab语言”的强大工具,c#所能够写出来的计算方法代码的效果堪比matlab。
  • 打赏
  • 举报
回复
可以求你矩阵然后 --> 可以求逆矩阵然后

一些需要成千上万行代码的复杂计算算法,其实就是一行非常简单的矩阵运算公式嘛。
  • 打赏
  • 举报
回复
矩阵运算时一个数学软件包基本的功能,写成简练的表达式是很符合数学家的习惯的——因为跟数学书上的符号一直。

随便写一个重载+号的例子吧。
    public class Mat
{
public double[,] Datas;

public static Mat operator +(Mat a, Mat b)
{
var result = new Mat { Datas = new double[a.Datas.GetLength(0), b.Datas.GetLength(1)] };
for (var i = 0; i < a.Datas.GetLength(0); i++)
for (var j = 0; j < b.Datas.GetLength(1); j++)
{
double sum = 0;
for (var k = 0; k < a.Datas.GetLength(1); k++)
sum += a.Datas[i, k] * b.Datas[k, j];
result.Datas[i, j] = sum;
}
return result;
}
}


这里为矩阵类,设计了+运算。于是打印两个简单的矩阵的和,就可以简单写为
            var x = new Mat
{
Datas = new double[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } }
};
var y = new Mat
{
Datas = new double[3, 2] { { 1.1, 2.2 }, { 3.3, 4.4 }, { 5.5, 6.6 } }
};
var result = x + y;
for (var i = 0; i < result.Datas.GetLength(0); i++)
{
for (var j = 0; j < result.Datas.GetLength(1); j++)
Console.Write("{0}\t", result.Datas[i, j]);
Console.WriteLine();
}


你可以写 x+y 这种表达式来计算矩阵求和,也可以写 k*x 这种表达式来计算矩阵乘,甚至是数乘,还可以求你矩阵然后直接矩阵乘法,例如
var t= Inv(a);
var result= t*((b*t+c*a)*t;
用简练的一个公式,就可以写出复杂的矩阵运算甚至解方程的过程来了。
threenewbee 2012-05-19
  • 打赏
  • 举报
回复
再给一个麻烦点的办法

int[] a = { 1, 2, 3 };
int[] b = { 4, 5, 6 };
int[] result = (from x in a.Select((v, i) => new { v, i })
join y in b.Select((v, i) => new { v, i }) on x.i equals y.i
select x.v + y.v).ToArray();


[Quote=引用 8 楼 的回复:]
你可以学学“运算符重载”。
[/Quote]

不建议重载。因为这容易让人混淆,一般对于数组,*表示笛卡尔集,+表示并集,-表示差集。

总之,如果你不告诉我你的运算规则,你写 a + b,我的理解不是每个相同索引的元素相加得到新数组,而是把a和b求并集得到一个新数组。
  • 打赏
  • 举报
回复
你可以学学“运算符重载”。
泥士0416 2012-05-19
  • 打赏
  • 举报
回复
3楼的方法,学习了。
xboxeer 2012-05-19
  • 打赏
  • 举报
回复
好形象的方法~拉链~~~
[Quote=引用 3 楼 的回复:]

int[] a = { 1, 2, 3 };
int[] b = { 4, 5, 6 };
int[] result = a.Zip(b, (x, y) => x + y).ToArray(); // result = { 5, 7, 9 }
[/Quote]
laomengzi 2012-05-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
int[] a = { 1, 2, 3 };
int[] b = { 4, 5, 6 };
int[] result = a.Zip(b, (x, y) => x + y).ToArray(); // result = { 5, 7, 9 }
[/Quote]
学习一下,
mizuho_2006 2012-05-19
  • 打赏
  • 举报
回复
3L的方法学习了
threenewbee 2012-05-19
  • 打赏
  • 举报
回复
int[] a = { 1, 2, 3 };
int[] b = { 4, 5, 6 };
int[] result = a.Zip(b, (x, y) => x + y).ToArray(); // result = { 5, 7, 9 }
暖枫无敌 2012-05-19
  • 打赏
  • 举报
回复
这个得遍历


int[] i = {1,2,3,4,5};
int[] j = {6,7,8,9,10};
int[] k = new int[i.Length];
for(int m=0;m<i.Length;m++)
{
k[m] = i[m] + j[m];
}
foreach(int n in k)
{
Response.Write(n.ToString());
}
mizuho_2006 2012-05-19
  • 打赏
  • 举报
回复
遍历吧。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧