# 练习 1
print(A == tf.transpose(tf.transpose(A)))
# 练习 2
C = A - 2.0
print(tf.transpose(A + C) == (tf.transpose(A) + tf.transpose(C)))
# 练习 3
C = tf.random.normal(shape=[3, 3])
print(tf.transpose(C + tf.transpose(C)) == C + tf.transpose(C))
print(tf.transpose(A + tf.transpose(A)) == A + tf.transpose(A)) # 非方阵转置会改变shape,从而无法加和
# 练习 4
print(X.shape)
print(len(X))
# 练习 5
C = tf.reshape(tf.range(120), [5, 3, 4, 2])
print(len(C)) # 总是输出0轴的长度
# 练习 6
print(A.shape, tf.reduce_sum(A, axis=0), sep='\n')
print(A / tf.reduce_sum(A, axis=0)) # 可以广播
print(A.shape, tf.reduce_sum(A, axis=1), sep='\n')
print(A / tf.reduce_sum(A, axis=1)) # 不可以广播
# 广播规则
# 如果两个张量的维度数不同,较小的张量会在前面添加维度,直到它们的维度数相同。
# 如果两个张量在某个维度上的大小不同,但其中一个张量的大小为 1,则可以在该维度上进行广播。
# 如果两个张量在某个维度上的大小不同且都不为 1,则无法进行广播
# 练习 7
C = tf.reshape(tf.range(24), [2, 3, 4])
print(tf.reduce_sum(C, axis=0).shape)
print(tf.reduce_sum(C, axis=1).shape)
print(tf.reduce_sum(C, axis=2).shape) # 选择哪一个axis,shape上对应的axis就会消失
# 练习 8
import math
C = tf.reshape(tf.range(6, dtype=tf.float32), [1, 2, 3])
print(C, tf.square(C), sep='\n')
print(tf.norm(C))
print(math.sqrt(tf.reduce_sum(tf.square(C))))
print(tf.norm(C) == math.sqrt(tf.reduce_sum(tf.square(C))))
# 可以看出tf.norm对矩阵元素求平方和后开根号,即求L^2范数,下面在更复杂shape下验证
C = tf.reshape(tf.range(120, dtype=tf.float32), [2, 3, 4, 5])
print(tf.norm(C))
print(math.sqrt(tf.reduce_sum(tf.square(C))))
print(tf.norm(C) == math.sqrt(tf.reduce_sum(tf.square(C))))