You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建对角线含50×50零块的2000×2000矩阵?

Efficiently Create a Large Matrix with Diagonal Zero Blocks

Hey there! Manually writing out dozens of lines to update each diagonal block is totally impractical for big matrices like your 2000×2000 one. Let's use two cleaner, scalable approaches that work for any matrix/block size you need.

Method 1: Parameterized Loop (Intuitive & Flexible)

This approach uses a simple loop that iterates over each diagonal block—no repetitive code needed. We'll define our matrix and block sizes as variables, so you can easily adjust them later:

# Define your parameters upfront
matrix_dim <- 2000
block_size <- 50
num_blocks <- matrix_dim %/% block_size  # Calculate number of diagonal blocks

# Initialize a matrix filled with 1s
a <- matrix(1, nrow = matrix_dim, ncol = matrix_dim)

# Loop through each diagonal block to set it to 0
for (block_idx in 0:(num_blocks - 1)) {
  start_pos <- block_idx * block_size + 1
  end_pos <- start_pos + block_size - 1
  a[start_pos:end_pos, start_pos:end_pos] <- 0
}

Why this works:

  • We calculate how many diagonal blocks there are (2000 / 50 = 40 blocks) instead of hardcoding numbers.
  • The loop runs just 40 times (way better than 50 manual lines!) and targets each block's position dynamically.

Method 2: Vectorized Approach (Concise & R-Style)

If you prefer avoiding loops entirely, R's vectorized operations let us build the matrix in one go. We'll create block indices for rows and columns, then use a conditional to set diagonal blocks to 0:

matrix_dim <- 2000
block_size <- 50

# Create block indices for every row and column
row_block_ids <- ceiling(seq_len(matrix_dim) / block_size)
col_block_ids <- ceiling(seq_len(matrix_dim) / block_size)

# Build the matrix: 0 where row and column blocks match, 1 otherwise
a <- ifelse(row_block_ids == col_block_ids, 0, 1)

Why this works:

  • seq_len(matrix_dim) generates a sequence from 1 to 2000, and ceiling(...) groups them into blocks of 50 (e.g., rows 1-50 get ID 1, 51-100 get ID 2, etc.).
  • ifelse checks each element: if its row block ID equals its column block ID (meaning it's on the diagonal), we set it to 0; else, 1.

Test with Your Small Example

Let's verify the vectorized method works with your 6×6, 2×2 block example:

matrix_dim <- 6
block_size <- 2

row_block_ids <- ceiling(seq_len(matrix_dim) / block_size)
col_block_ids <- ceiling(seq_len(matrix_dim) / block_size)
a <- ifelse(row_block_ids == col_block_ids, 0, 1)

print(a)

This outputs exactly the matrix you shared:

[,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    0    1    1    1    1
[2,]    0    0    1    1    1    1
[3,]    1    1    0    0    1    1
[4,]    1    1    0    0    1    1
[5,]    1    1    1    1    0    0
[6,]    1    1    1    1    0    0

Both methods scale perfectly to your 2000×2000 matrix—no more repetitive code!

内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:40:51