定义矩阵乘法;修改了错误的行
Defining matrix multiplication; wrong rows being modified
我正在尝试定义一个矩阵乘法函数,如下所示:
def matrix_mult(a, b)
#a is mxn, b is nxq, so prod of a and b is mxq
m = a.length; n = a[0].length;
n = b.length; q = b[0].length;
prod=Array.new(m, Array.new(q,0));
(0...m).each do |i|
(0...q).each do |j|
#dot i-th row of m with j-th row of n:
(0...n).each {|k| prod[i][j]+=(a[i][k])*(b[k][j])}
#puts "i="+i.to_s
#puts "j="+j.to_s
#print prod; print "\n"
end
end
return prod
end
在 2×2 样本上进行测试时,在第一次迭代中(其中 i=j=0),带有变量 "k" 的行正确计算了 prod[0][0]。但是,它同时将 prod[1][0] 设置为相同的值,即使该块应该只修改 prod[0][0]。同样,当 i=0 和 j=1 时,我得到了 prod[0][1] 的正确值,但是 prod[1][1] 同时被修改了。
下面是我得到的示例,以说明问题:
a=[[1, 2], [3, 2]]; b=[[3, 2], [1, 1]])
##output below
i =0
j =0
[[5, 0], [5, 0]] ##I don't know why the second row was made [5,0]
i =0
j =1
[[5, 4], [5, 4]]
i =1
j =0
[[16, 4], [16, 4]]
i =1
j =1
[[16, 12], [16, 12]]
谁能解释一下这是什么原因造成的?
如果您按如下方式修改 def
的开头,您会发现它有效:
def matrix_mult(a, b)
#a is mxn, b is nxq, so prod of a and b is mxq
m = a.length; n = a[0].length;
n = b.length; q = b[0].length;
prod=Array.new(m,0);
(0...m).each do |i|
prod[i] = Array.new(q,0);
(0...q).each do |j|
....
由于您的 prod
是一个数组数组,因此每个顶级元素必须是一个 单独的 数组。
还有一项重要更改需要进行。您的代码设置 n
两次,而它实际上应该检查是否满足先决条件。
我正在尝试定义一个矩阵乘法函数,如下所示:
def matrix_mult(a, b)
#a is mxn, b is nxq, so prod of a and b is mxq
m = a.length; n = a[0].length;
n = b.length; q = b[0].length;
prod=Array.new(m, Array.new(q,0));
(0...m).each do |i|
(0...q).each do |j|
#dot i-th row of m with j-th row of n:
(0...n).each {|k| prod[i][j]+=(a[i][k])*(b[k][j])}
#puts "i="+i.to_s
#puts "j="+j.to_s
#print prod; print "\n"
end
end
return prod
end
在 2×2 样本上进行测试时,在第一次迭代中(其中 i=j=0),带有变量 "k" 的行正确计算了 prod[0][0]。但是,它同时将 prod[1][0] 设置为相同的值,即使该块应该只修改 prod[0][0]。同样,当 i=0 和 j=1 时,我得到了 prod[0][1] 的正确值,但是 prod[1][1] 同时被修改了。
下面是我得到的示例,以说明问题:
a=[[1, 2], [3, 2]]; b=[[3, 2], [1, 1]])
##output below
i =0
j =0
[[5, 0], [5, 0]] ##I don't know why the second row was made [5,0]
i =0
j =1
[[5, 4], [5, 4]]
i =1
j =0
[[16, 4], [16, 4]]
i =1
j =1
[[16, 12], [16, 12]]
谁能解释一下这是什么原因造成的?
如果您按如下方式修改 def
的开头,您会发现它有效:
def matrix_mult(a, b)
#a is mxn, b is nxq, so prod of a and b is mxq
m = a.length; n = a[0].length;
n = b.length; q = b[0].length;
prod=Array.new(m,0);
(0...m).each do |i|
prod[i] = Array.new(q,0);
(0...q).each do |j|
....
由于您的 prod
是一个数组数组,因此每个顶级元素必须是一个 单独的 数组。
还有一项重要更改需要进行。您的代码设置 n
两次,而它实际上应该检查是否满足先决条件。