20、矩阵-旋转图像
最编程
2024-04-12 08:53:04
...
解题方法
这个问题是关于如何将一个矩阵顺时针旋转90度。为了解决这个问题,我们可以采用以下步骤:
转置矩阵:首先,我们需要对矩阵进行转置。转置意味着将矩阵的行变成列,列变成行。对于矩阵中的每个元素matrix[i][j],在转置后它会移动到位置matrix[j][i]。
翻转每一行:转置矩阵后,我们需要将每一行的元素翻转,即第一个元素和最后一个元素交换位置,这样对于每一行都进行操作,直至中间的元素。
以题目中的例子来说:
原始矩阵:
1 2 3
4 5 6
7 8 9
转置后的矩阵:
1 4 7
2 5 8
3 6 9
每行翻转后的矩阵:
7 4 1
8 5 2
9 6 3
这就是顺时针旋转90度后的矩阵。
代码如下:
class Solution {
public static void rotate(int[][] matrix) {
// 矩阵转置
transpose(matrix);
// 翻转每一行
reverseRows(matrix);
}
private static void transpose(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
// 交换元素 matrix[i][j] 和 matrix[j][i]
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
private static void reverseRows(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < n; i++) {
int start = 0;
int end = n - 1;
while (start < end) {
// 交换行的首尾元素
int temp = matrix[i][start];
matrix[i][start] = matrix[i][end];
matrix[i][end] = temp;
start++;
end--;
}
}
}
}
推荐阅读
-
三维空间中的刚体运动 - (1) 驰放坐标和旋转矩阵
-
带有平移缩放旋转功能的 opengl 矩阵变换
-
机器人学入门学习笔记 (II) - 运算符、变换、姿态描述、等效旋转矩阵
-
矩阵范式与图像识别:范式在图像识别中的重要性
-
旋转矩阵的推导及其应用
-
如何在 C++ 开发中处理图像旋转问题
-
STM32 >> 矩阵键盘(代码风格优美,简明易懂)-key.h /** ****************************************************************************** * @file bsp_key.h * @author Waao * 版本 V1.0.0 * 日期:2018 年 12 月 20 日 * 该文件包含一些电路板支持包对 KEY 的定义。 * ****************************************************************************** * @ 注意 * * 无 * ****************************************************************************** */ #ifndef __BSP_KEY_H_ #define __BSP_KEY_H_ #include <stm32f4xx.h>; #include <bsp_systick.h>; #include <bsp_usart.h>; // 第 2 列、第 3 列、第 4 列 #define C1_PIN GPIO_Pin_2 #define C1_GPIO_PORT GPIOE #define C1_GPIO_CLK RCC_AHB1Periph_GPIOE #define C2_PIN GPIO_Pin_3 #define C2_GPIO_PORT GPIOE #define C2_GPIO_CLK RCC_AHB1Periph_GPIOA #define C3_PIN GPIO_Pin_4 #define C3_GPIO_PORT GPIOE #define C3_GPIO_CLK RCC_AHB1Periph_GPIOA #define C4_PIN GPIO_Pin_5 #define C4_GPIO_PORT GPIOE #define C4_GPIO_CLK RCC_AHB1Periph_GPIOE // 行 1、行 2、行 3 #define R1_PIN GPIO_Pin_12 #define R1_GPIO_PORT GPIOB #define R1_GPIO_CLK RCC_AHB1Periph_GPIOB #define R2_PIN GPIO_Pin_13 #define R2_GPIO_PORT GPIOB #define R2_GPIO_CLK RCC_AHB1Periph_GPIOB #define R3_PIN GPIO_Pin_14 #define R3_GPIO_PORT GPIOB #define R3_GPIO_CLK RCC_AHB1Periph_GPIOB #define R4_PIN GPIO_Pin_15 #define R4_GPIO_PORT GPIOB #define R4_GPIO_CLK RCC_AHB1Periph_GPIOB // 检测和输出 #define DETECT_C1 GPIO_ReadInputDataBit(C1_GPIO_PORT, C1_PIN) #define DETECT_C2 GPIO_ReadInputDataBit(C2_GPIO_PORT, C2_PIN) #define DETECT_C3 GPIO_ReadInputDataBit(C3_GPIO_PORT, C3_PIN) #define DETECT_C4 GPIO_ReadInputDataBit(C4_GPIO_PORT, C4_PIN) #define DETECT_R1 GPIO_ReadInputDataBit(R1_GPIO_PORT, R1_PIN) #define DETECT_R2 GPIO_ReadInputDataBit(R2_GPIO_PORT, R2_PIN) #define DETECT_R3 GPIO_ReadInputDataBit(R3_GPIO_PORT, R3_PIN) #define DETECT_R4 GPIO_ReadInputDataBit(R4_GPIO_PORT, R4_PIN) #define S1 0x77 #define S2 0xB7 #define S3 0xD7 #define S4 0xE7 #define S5 0x7B #define S6 0xBB #define S7 0xDB #define S8 0xEB #define S9 0x7D #define S10 0xBD #define S11 0xDD #define S12 0xED #define S13 0x7E #define S14 0xBE #define S15 0xDE #define S16 0xEE void GPIO_RCC_Config(void); void ROCI_GPIO_Config(void); void RICO_GPIO_Config(void); void KEY_GPIO_ConfigAndDetect(void); #endif
-
20、矩阵-旋转图像
-
R-FCN 论文理解 - I. R-FCN 入门 1.R-FCN 的贡献 提出位置敏感得分图,解决目标检测的位置敏感问题; 基于区域的全卷积网络框架,用于两阶段目标检测; 比 Faster-RCNN 快 2.5-20 倍(在 K40GPU 上使用 ResNet-101 网络,0.17 秒/图像);。 2.R-FCN 与传统两阶段网络的异同点 图 11 R-FCN 与传统两级网络的异同点 相同点:首先是两个两级检测框架(全卷积子网络+RoI-wise 子网络);其次是最终输出都是相应的类别和相应的 BB;不同点:如上图所示,R-FCN 与 Faster R-CNN 相比,R-FCN 有更深的共享卷积:如上图所示,与 Faster R-CNN 相比,R-FCN 有更深的共享卷积网络层,因此可以获得更多抽象特征;从图中表格可以看出,Faster R-CNN 的共享卷积子网络为 91 层,RoI-wise 子网络为 91 层。RoI-wise子网络为 10 层,而 R-FCN只有深度为 101 层的共享卷积子网络。与 R-CNN 相比,最大的区别在于直接获取整幅图像的特征图,然后提取相应的 ROI,而不是直接在不同的 ROI 上获取相应的特征图。
-
OpenCV 开发说明 (十七):相机校准 (II):通过棋盘格校准计算相机内部参考矩阵以校正偏差相机图像