Problem 9. Who Has the Most Change?
You have a matrix for which each row is a person and the columns represent the number of quarters, nickels, dimes, and pennies that person has (in that order). What is the row index of the person with the most money?
Note for those unfamiliar with American coins: quarter = $0.25, dime = $0.10, nickel = $0.05, penny = $0.01.
Example:
Input a = [1 0 0 0; 0 1 0 0]
Output b = 1
since the first person will have $0.25 and the second person will have only $0.05.
一开始的时候没仔细看题目,以为是输出这些人拥有钱数的最大值,直接想法是通过矩阵乘法运算得到每个人的钱数,然后使用max命令得到钱数的最大值,中间一个小错误就是把max还错打成了Max,导致没办法识别。后来发现是输出那个人的序号,也就是矩阵乘法所得到的列向量中最大值对应的行数,通过在网上搜索发现使用find命令可以完成,指令如下。
[row,col] = find(___)
用在代码中的形式为,
function b = most_change(a)
Coins = [0.25;0.05;0.10;0.01];
A = a*Coins;
[row,col] = find(A == max(A));%find的用法是查找一个矩阵中某个元素,注意语法
b = row;
end
具体来看的话,这个题目都明确了是列向量,试了一下,发现下述简化后的代码同样可行,
function b = most_change(a)
Coins = [0.25;0.05;0.10;0.01];
A = a*Coins;
b = find(A == max(A));%find的用法是查找一个矩阵中某个元素,注意语法
end
【find指令学习】
k = find(X)%返回矩阵X中非零元素的序号
k = find(X,n)%返回矩阵X中前n个非零元素
k = find(X,n,direction)%这里的direction有'first'和'last'两个选项,分别代表前n个与后n个满足条件的元素,上面默认的就是first
[row,col] = find(___)%返回符合条件的元素的行和列,储存在row和col两个变量中,注意row和col也是可以改变名称的,并非固定不变
[row,col,v] = find(___)%v代表value,即在返回行列数的同时返回元素值
Ex. 在 4×4 幻方矩阵中查找前五个小于 10 的元素。
X = magic(4)
X = 4×4
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
k = find(X<10,5)
k = 5×1
2
3
4
5
7
查看 X 的对应元素。
X(k)
ans = 5×1
5
9
4
2
7
从这个Matlab官方文档中的例子又体现出了其应用矩阵运算的便捷性,Matlab中的矩阵都默认以列向量的方式进行储存,所得到的元素下标都是把矩阵中元素按每列顺序排好后的相应编号,而将这些编号组成的列向量代到某个矩阵中时,也可以十分快捷地读取出其对应的元素
另外在查找非整数值时,需要使用容差值来进行查找,否则,由于浮点舍入误差有时会生成空矩阵。
Ex.
y = 0:0.1:1
y = 1×11
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000 1.0000
k = find(y==0.3)
k = 1x0 empty double row vector❌
k = find(abs(y-0.3) < 0.001)
k = 4✅
Ex. 在 4×2×3 数组中查找非零元素。指定两个输出 row 和 col 以返回非零元素的行和列下标。如果输入是多维数组 (N > 2),find 返回 col 作为 X 的 N-1 个尾部维度的线性索引。
X = zeros(4,2,3);
X([1 12 19 21]) = 1
X(:,:,1) =
1 0
0 0
0 0
0 0
X(:,:,2) =
0 0
0 0
0 0
1 0
X(:,:,3) =
0 1
0 0
1 0
0 0
[row,col] = find(X)
row = 4×1
1
4
3
1
col = 4×1
1
3
5
6
从这里面的列数可以看出,多维数组的情况下,又是将这些列分别拿出来了,列数是总列数而不是4*2中的两列。